Как использовать индекс в операторе выбора?


97

Допустим, в таблице сотрудников я создал индекс (idx_name) в emp_nameстолбце таблицы.

Нужно ли мне явно указывать имя индекса в предложении select, или оно будет автоматически использоваться для ускорения запросов.

Если это необходимо указать в предложении select, каков синтаксис для использования индекса в запросе select?

Ответы:


87

Если вы хотите проверить индекс, чтобы увидеть, работает ли он, вот синтаксис:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Оператор WITH заставит использовать индекс.


83
Этот пост не отвечает на вопрос. Вкратце ответ: вам не нужно указывать индекс в запросе. Используется (или нет) автоматически. Однако вы можете заставить это сделать это. Подробнее (когда и зачем это делать) в других сообщениях ниже.
Раст

34

Хороший вопрос,

Обычно механизм БД должен автоматически выбирать индекс для использования на основе планов выполнения запросов, которые он строит. Однако бывают довольно редкие случаи, когда вы хотите заставить БД использовать определенный индекс.

Чтобы иметь возможность ответить на ваш конкретный вопрос, вы должны указать используемую БД.

Для MySQL вы хотите прочитать документацию по синтаксису Index Hint, чтобы узнать, как это сделать.


30

Как использовать индекс в операторе выбора?
сюда:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

И еще много способов проверить это

Мне нужно явно указывать?

  • Нет, не нужно указывать явно.
  • Механизм БД должен автоматически выбирать индекс для использования на основе планов выполнения запросов, которые он строит из ответа @Tudor Constantin.
  • Оптимизатор решит, ускорит ли использование индекса ваш запрос, и если да, то он будет использовать индекс. из ответа @niktrl

13

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

Если ваш запрос имеет форму:

SELECT Name from Table where Name = 'Boris'

И 1 строка из 1000 имеет имя Борис, оно почти наверняка будет использовано. Если всех зовут Борис, он, вероятно, прибегнет к сканированию таблицы, поскольку индекс вряд ли будет более эффективной стратегией для доступа к данным.

Если это широкая таблица (много столбцов), и вы делаете:

SELECT * from Table where Name = 'Boris'

Затем он может по-прежнему выбрать выполнение сканирования таблицы, если есть разумное предположение, что получение других столбцов из таблицы займет больше времени, чем просто поиск имени, или, опять же, если он, вероятно, будет получать все равно много строк.


9

Оптимизатор решит, ускорит ли использование индекса ваш запрос, и если да, то он будет использовать индекс.

В зависимости от вашей СУБД вы можете принудительно использовать индекс, хотя это не рекомендуется, если вы не знаете, что делаете.

Как правило, вы должны индексировать столбцы, которые вы используете в соединениях таблиц и операторах where.


5

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

SELECT * FROM TABLE WHERE attribute = 'value'

Будет использоваться соответствующий индекс.


5

Как правило, когда вы создаете индекс для таблицы, база данных автоматически использует этот индекс при поиске данных в этой таблице. С этим ничего делать не нужно.

Однако в MSSQL вы можете указать, index hintчто может указывать, что для выполнения этого запроса следует использовать определенный индекс. Более подробную информацию об этом можно найти здесь .

Index hintтакже, похоже, доступен для MySQL . Спасибо Тюдору Константину.


1

Подсказка индекса доступна только для серверов баз данных Microsoft Dynamics. Для традиционного SQL Server фильтры, которые вы определяете в своем предложении Where, должны убедить движок использовать любые соответствующие индексы ... При условии, что план выполнения движка может эффективно определять, как читать информацию (будь то полное сканирование таблицы или индексированное сканирование ) - он должен сравнить их перед выполнением соответствующего оператора как часть встроенного оптимизатора производительности.

Однако вы можете заставить оптимизатор сканировать, используя что-то вроде

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Или для поиска определенного индекса, используя что-то вроде

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

Выбор за вами. Посмотрите на свойства индекса таблицы на панели объектов, чтобы понять, какой индекс вы хотите использовать. Он должен соответствовать вашему фильтру (ам).

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.