очень медленный счет с 7 миллионами строк - PullRequest
5 голосов
/ 03 ноября 2011

Я получил более 7 миллионов строк в таблице, а

SELECT COUNT(*) FROM MyTable where MyColumn like '%some string%'

дает мне 20 000 строк и занимает более 13 секунд.

Таблица имеет НЕКЛАСТЕРНЫЙ ИНДЕКС для MyColumn.

Есть ли способ улучшить скорость?

Ответы [ 3 ]

5 голосов
/ 03 ноября 2011

Ведущий поиск по шаблону can not оптимизируется с помощью T-SQL и не будет использовать индекс

Посмотрите на полнотекстовый поиск SQL Server

3 голосов
/ 03 ноября 2011

Вы можете попробовать полнотекстовый поиск или систему текстового поиска, например Lucene .

2 голосов
/ 03 ноября 2011

Сначала попробуйте использовать двоичное сопоставление, что будет означать, что сложные правила Unicode заменяются простым сравнением байтов.

SELECT COUNT(*) 
FROM MyTable 
WHERE MyColumn COLLATE Latin1_General_BIN2 LIKE '%some string%'

Также посмотрите главу под названием «Построить свой собственный индекс» в SQL Server MVP Deep Dives , написанный Эрландом Соммарскогом

Основная идея заключается в том, что вы вводите ограничение для пользователя и требует, чтобы строка была длиной не менее трех смежных символов.Затем вы извлекаете все три последовательности букв из поля MyColumn и сохраняете эти фрагменты в таблице вместе с MyTable.id, к которому они принадлежат.При поиске строки вы также разбиваете ее на три буквенных фрагмента и смотрите, к какому идентификатору записи они принадлежат.Таким образом, вы найдете подходящие строки намного быстрее.Это стратегия в двух словах.

В книге описываются детали реализации и способы дальнейшей оптимизации.

...