postgresql pg_trgm ускорить, где условия

Я использую расширение pg_trgm для проверки сходства текстового столбца. Я хочу ускорить его, используя дополнительные условия, но безуспешно. Скорость такая же. Вот мой пример:

    create table test (
    id serial,
    descr text,
    yesno text,
    truefalse boolean
    );
    insert into test SELECT generate_series(1,1000000) AS id, 
md5(random()::text) AS descr ; 
    update test set yesno = 'yes' where id < 500000;
    update test set yesno = 'no' where id > 499999;
    update test set truefalse = true where id < 100000;
    update test set truefalse = false where id > 99999;
    CREATE INDEX test_trgm_idx ON test USING gist (descr gist_trgm_ops);

Итак, когда я выполняю запрос, нет никакой разницы, использую ли я предложение where.

 select descr <->  '65c141ee1fdeb269d2e393cb1d3e1c09' 
 as dist, descr, yesno, truefalse from test 
   where 
   yesno = 'yes'
   and 
   truefalse = true 
order by dist 
limit 10;

Это правильно?


person Stepan Pavlov    schedule 16.08.2017    source источник
comment
Ну, у вас нет индексов на yesno или truefalse. Следовательно, я думаю, что Postgres придется сканировать, чтобы применить это условие WHERE, что может потребовать некоторых ресурсов. Кроме того, количество оставленных записей может быть довольно большим, и в обоих случаях Postgres должен выполнить сортировку по dist, чтобы применить предложение LIMIT.   -  person Tim Biegeleisen    schedule 16.08.2017
comment
@TimBiegeleisen, я добавил индекс для логического столбца, это не влияет...   -  person Stepan Pavlov    schedule 16.08.2017
comment
Что ж, логический столбец имеет только два возможных значения, поэтому кардинальность высока, и поэтому индекс может быть бесполезен.   -  person Tim Biegeleisen    schedule 16.08.2017


Ответы (1)


После создания тестовых данных выполните АНАЛИЗ, чтобы убедиться, что статистика обновлено. Затем вы можете использовать EXPLAIN, чтобы выяснить это.

На моей машине он выполняет сканирование индекса на test_trgm_idx, чтобы сканировать строки по порядку, чтобы он мог остановиться при достижении предела. С оператором where на самом деле немного больше работы, потому что он должен сканировать больше строк, прежде чем будет достигнут предел, хотя разница во времени не заметна.

person Eelke    schedule 16.08.2017
comment
Я побежал анализировать, потом объяснить. Ряды сокращаются в 10 раз, а стоимость остается прежней. Так же как и время исполнения... - person Stepan Pavlov; 16.08.2017