Проблема производительности между StartsWith и EndsWith на MSSQL - PullRequest
0 голосов
/ 22 апреля 2019

Я привык к двум различным условиям на одних и тех же данных, сгенерированных автоматически EF, но только один другой стек меня по производительности LIKE 'blah%' (начинается с) выполнить также менее чем за 1 секунду, но когда я пытаюсь запустить LIKE '%blah' (заканчивается), это выполняется очень медленно - более 40 секунд. Относительно этого получения исключения тайм-аута EF и т. Д. (Я знаю, как продлить тайм-ауты), но мне просто нужно знать, каковы различия и как предотвратить снижение производительности в этом небольшом различие.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

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

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

0 голосов
/ 23 апреля 2019

Я нашел решение проблемы производительности EndsWith, исправление от здесь .

CREATE INDEX rev_col_idx ON table (reverse(column) text_pattern_ops); -- is not required

SELECT * FROM table WHERE reverse(column) like reverse('%something')
...