Точно както сте чели от jjanes другаде:индексът на израз се разглежда само ако изразът съвпада точно в предиката на заявката. Планирането на заявки в Postgres не е AI. Това бързо би преодоляло целта да се правят бързи заявки, ако планирането им отнема твърде много време.
Можете да оптимизирате малко индекса си, ако това е някаква утеха. left()
е по-просто и по-бързо от substring()
:
CREATE INDEX record_changes_log_detail_old_value_ix_btree
ON record_changes_log_detail (left(old_value,1024) text_pattern_ops);
Освен това имамаксимален размер на реда от 2704 байта за btree индекси, а не "ограничение от 2172 знака за B-дървета" .
Най-важното е, че само за проверки на равенство, както предполага вашият въпрос, btree индекс върху хеш стойност, използвайки md5(old_value)
или hashtext(old_value)
би било много по-ефикасно. Ако го направите, не забравяйте да се защитавате срещу хеш колизии така:
SELECT *
FROM record_changes_log_detail
WHERE hashtext(old_value) = hashtext('Gold Kerrison Neuro')
AND old_value = 'Gold Kerrison Neuro';
Първият предикат ви дава бърз достъп до индекса. Вторият изключва фалшивите положителни резултати. Сблъсъците трябва да са изключително редки. Но възможно. И възможността расте с размера на масата.
Свързано:
- Заявката SELECT с DISTINCT в структура на таблица за графики е много бавна
- Кой е оптималният тип данни за поле MD5?
- Пълнотекстово търсене в CouchDB
Или хеш индекс, какъвто вече обмисляте за себе си:
- Защо хеш индексът на Postgres 11 е толкова голям?
(Тук не е нужно да се притеснявате за хеш колизии; обработват се вътрешно.)