postgres: индексирование int и text col для ускорения аналогичного оператора [duplicate]

неопределенная ссылка на WinMain@16 или аналогичную «необычную» main() ссылку на точку входа (особенно для ).

Вы возможно, пропустили, чтобы выбрать правильный тип проекта с вашей реальной IDE. IDE может захотеть связать, например. Проекты приложений Windows для такой функции точки входа (как указано в недостающей ссылке выше) вместо обычной int main(int argc, char** argv);.

Если ваша среда IDE поддерживает Plain Console Projects , вы может захотеть выбрать этот тип проекта вместо проекта приложения Windows.


Здесь case1 и case2 обрабатываются более подробно из реальный мир проблема.

80
задан Erwin Brandstetter 18 February 2014 в 23:16
поделиться

5 ответов

FTS не поддерживает LIKE

Ранее принятый ответ был неправильным. Полнотекстовый поиск с его полными текстовыми индексами вовсе не для оператора LIKE, он имеет свои собственные операторы и не работает для произвольных строк. Он работает с словами на основе словарей и заканчивается. Он поддерживает сопоставление префикса для слов , но не с оператором LIKE:

Триграммные индексы для LIKE

Установите дополнительный модуль pg_trgm , который предоставляет классы операторов для Индексы триграмм GIN и GiST для поддержки всех шаблонов LIKE и ILIKE, а не только левых:

Пример индекса:

CREATE INDEX tbl_col_gin_trgm_idx  ON tbl USING gin  (col gin_trgm_ops);

Или:

CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);

Пример запроса:

SELECT * FROM tbl WHERE col LIKE '%foo%';   -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%';  -- works case insensitively as well

триграмм? Что относительно коротких строк?

Слова с менее чем тремя буквами в индексированных значениях все еще работают. Руководство:

Каждое слово считается префиксом двух пробелов, а при определении набора триграмм, содержащихся в строке, должно быть пробел.

И шаблоны поиска с менее чем тремя буквами? Руководство:

Для поиска LIKE и регулярных выражений следует иметь в виду, что шаблон без экстрагируемых триграмм будет дегенерировать до сканирования полного индекса.

Значение, что сканирование индекса / растрового индекса все еще работает (планы запросов для подготовленного оператора не будут прерываться), он просто не будет покупать вам лучшую производительность. Как правило, никаких больших потерь нет, так как строки с 1 или 2 буквами вряд ли избирательны (более чем на несколько процентов от базовых табличных совпадений), а поддержка индексов не улучшит производительность, потому что полное сканирование таблицы выполняется быстрее.

text_pattern_ops для сопоставления префикса

Для только левых привязанных шаблонов (без ведущего шаблона) вы получаете оптимальное значение с помощью подходящего класса операторов ] для индекса btree: text_pattern_ops или varchar_pattern_ops. Как встроенные функции стандартных Postgres, так и дополнительный модуль. Пример:

CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);

Пример запроса:

SELECT * FROM tbl WHERE col LIKE 'foo%';  -- no leading wildcard

Или , [ если вы должны запускать свою базу данных с помощью 'C' locale (фактически no locale), тогда все сортируется в соответствии с порядком байтов в любом случае и простой индекс btree с оператором по умолчанию класс выполняет эту работу.

Подробнее, пояснения, примеры и ссылки в этих связанных ответах на dba.SE:

207
ответ дан Erwin Brandstetter 26 August 2018 в 22:15
поделиться

Возможно, быстрые - это привязанные шаблоны с чувствительностью к регистру, которые могут использовать индексы. то есть нет дикой карты в начале строки соответствия, чтобы исполнитель мог использовать сканирование диапазона индекса. ( соответствующий комментарий в документах находится здесь ). Более низкие и похожие также потеряют способность использовать индекс, если вы специально не создаете индекс для этой цели (см. функциональные индексы ) .

Если вы хотите найти строку в середине поля, вы должны изучить полный текст или триграммные индексы . Первый из них находится в ядре Postgres, другой доступен в модулях contrib.

7
ответ дан Ants Aasma 26 August 2018 в 22:15
поделиться

Ваши похожие запросы, вероятно, не могут использовать созданные вами индексы, потому что:

1) ваши критерии LIKE начинаются с подстановочного знака.

2) вы использовали функцию с вашим LIKE критерии.

1
ответ дан Asaph 26 August 2018 в 22:15
поделиться

Вы можете установить Wildspeed , другой тип индекса в PostgreSQL. Wildspeed работает с групповыми символами% word%, без проблем. Недостатком является размер индекса, который может быть большим, очень большим.

4
ответ дан Frank Heikens 26 August 2018 в 22:15
поделиться

Пожалуйста, выполните нижеуказанный запрос для улучшения производительности запроса LIKE в postgresql. создайте такой индекс для больших таблиц:

CREATE INDEX <indexname> ON <tablename> USING btree (<fieldname> text_pattern_ops)
2
ответ дан Noyal 26 August 2018 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: