2016-11-03 5 views
0

У меня есть таблица с столбцом tsvector, также я создаю индекс для этого столбца. Также у меня есть несколько столбцов (и индексы для этих столбцов), которые требуются для поиска.Postgresql полнотекстовый поиск с другими условиями

Например: Таблица: вакансии
колонок: название, описание (название + описание = поисковый вектор), заработная плата (целое значение с индексом).

Я хочу, чтобы найти все вакансии с текстом, который содержит в названии + описании, а также заработной платы> 1000.

Какой столбец будет первым условием.

SELECT * 
FROM vacancies 
WHERE title_description_tsvector @@ plainto_tsquery('php developer') 
    AND salary > 1000; 

ИЛИ

SELECT * 
FROM vacancies 
WHERE salary > 1000 
    AND title_description_tsvector @@ plainto_tsquery('php developer'); 
+0

Порядок условий в сочетании с 'AND' не имеет значения. Оба запроса возвратят одно и то же. –

+0

Но для использования индексов у него есть метр. – trauma

+0

Нет, даже для использования индекса это будет иметь значение. Проверьте план выполнения, используя 'explain analysis select ...', и вы увидите –

ответ

1

Изменение порядка в WHEREне повлияет оптимизатор на своем решении.

Если по какой-то причине вы хотите, чтобы заставить его принять один индексную похоть над другими (например, вы проверили планы и посмотреть, он использует salary индекса, а затем Filter: (title_description_tsvector @@ plainto_tsquery('php developer')), так что вы не видите свой индекс на title_description_tsvector и вы чувствуете, оптимизатор неправильно). Итак, вы хотите, чтобы сделать его первым выбрали разыскиваемый индекс (например, с намеками в Oracle), вы можете использовать CTE, чтобы попробовать, как:

EXPLAIN 
WITH pre as (SELECT * 
FROM vacancies 
WHERE title_description_tsvector @@ plainto_tsquery('php developer') 
) 
SELECT * 
FROM pre 
WHERE salary > 1000; 

Я совершенно уверен, что стоимость будет выше, хотя. Если нет - время для проверки autovacuum

Смежные вопросы