Проблема производительности с ключевым словом LIKE в T-SQL - PullRequest
1 голос
/ 25 мая 2011

У меня есть несколько записей в таблице, которые выглядят так:

       COLUMN1        |   NUMBER
--------------------------------------
'http://namespace1/#1'|     1
'http://namespace1/#2'|     0
'http://namespace1/#3'|     0
'http://namespace1/#4'|     0
'http://namespace2/#1'|     0
'http://namespace2/#2'|     0
'http://namespace2/#3'|     0
'http://namespace2/#4'|     1
...

Прямо сейчас мой запрос выглядит так:

SELECT COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE 'http://namespace1/%'

Проблема этого запроса в том, что он очень и очень медленный, когда в таблице много записей. Может быть возвращена только одна запись.

Есть ли более быстрая альтернатива этому запросу?

Ответы [ 4 ]

2 голосов
/ 25 мая 2011

Вам нужен индекс как для столбцов NUMBER, так и для столбцов COLUMN1, чтобы быть полезным здесь, поскольку предложение WHERE имеет 2 условия.

Текущий индекс COLUMN1 либо игнорируется, поскольку бит NUMBER = 1, либо используетсяс поиском ключа, чтобы получить номер.В любом случае, это объясняет, что видит OP.

Редактировать:

Является ли индекс (NUMBER,COLUMN1) или (COLUMN1,NUMBER) методом проб и ошибок.Я подозреваю второе, если есть только 2 значения на NUMBER, но YMMV

1 голос
/ 25 мая 2011

Поскольку может быть возвращена только одна запись, можно выполнить вершину (1). В некоторых случаях top (1) останавливает цикл условий при первом совпадении (когда нет order by). Запрос будет намного быстрее.

SELECT top(1) COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE 'http://namespace1/%'
1 голос
/ 25 мая 2011

Добавить индекс для столбца column1 и number.Попробуйте оба способа: column1 и number / number и column1.Попробуйте индексы по одному за раз.В зависимости от данных это может иметь значение.

Индексы помогают с командой like, где% не находится перед аналогичным значением.В этом случае это должно сильно помочь.

0 голосов
/ 25 мая 2011

A индекс покрытия на COLUMN1 и NUMBER, кластеризованный или некластеризованный, может быть лучшим вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...