Индекс базы данных не используется, если критерий где равен! =? - PullRequest
6 голосов
/ 19 ноября 2009

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

select * from Table where x = 'somestring'

Однако, похоже, он не используется, когда запрос похож на

select * from Table where x != 'someotherstring'

Это нормально или я что-то упускаю в запросе? Фактический запрос, конечно, намного больше, и это может быть вызвано каким-то другим фактором. Любые другие идеи, почему индекс не будет использоваться в запросе?

Ответы [ 6 ]

14 голосов
/ 19 ноября 2009

Это нормально. Индекс будет использоваться только при наличии условия '='. Поиск по индексу! = Условие неэффективен.

Аналогично, для этого может использоваться индекс (в Oracle)

select * from Table where x like 'some%'

но это не

select * from Table where x like '%thing%'

Кроме того, select * from Table where x between 1 and 10 будет использовать индекс

но не select * from Table where x not between 1 and 10

3 голосов
/ 19 ноября 2009

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

2 голосов
/ 19 ноября 2009

это абсолютно нормально. Индекс используется для поиска чего-то точного. где вы начинаете, когда я прошу вас посмотреть словарь, когда я сказал, что не начинайте с 'S'.

вы всегда можете сделать это.

select * from Table a
where not exist (select * from table b where x = 'somestring' and a.key = b.key)
1 голос
/ 19 ноября 2009

Это действительно нормально - чтобы использовать индекс, вам нужно использовать точное совпадение (например, оператор = =) или что-то вроде запроса диапазона.

Запрос, который определяет «отрицательные» критерии ( НЕ что-то или другое), как правило, не может быть удовлетворен поиском по индексу - вам придется искать все, кроме определенного значения. Это не работает хорошо - как правило, полное сканирование таблицы (сканирование кластерного индекса в SQL Server) будет быстрее, просто проверяя критерии, которые должны быть сопоставлены (или не сопоставлены, в этом случае).

0 голосов
/ 19 ноября 2009

Я думаю, что условие! = Может использовать индекс (в MSSQL). Согласно плану выполнения в MSSQL, если у меня есть индекс для одного поля, и я применяю предложение where к этому полю, одно с! =, А другое с =, они оба приводят к одному и тому же плану выполнения, оба используют индекс искать.

0 голосов
/ 19 ноября 2009

Вы не сказали, какой движок базы данных используете.

Например,

MS SQL Server имеет Equality indexes и Inequality indexes. Последние используются, когда оператор not equal находится в игре.

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