Некластеризованный индекс SQL Server

У меня есть два разных запроса в SQL Server, и я хочу уточнить

  1. как план выполнения будет другим, и
  2. какой из них эффективнее

Запросы:

SELECT * 
FROM table_name  
WHERE column < 2

а также

SELECT column 
FROM table_name 
WHERE column < 2

У меня есть некластеризованный индекс на column.

Раньше я использовал Postgresql и не знаком с SQL Server и подобными индексами.

Когда я прочитал много вопросов здесь, я сделал две заметки:

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

  • С помощью некластеризованного индекса я мог бы получить копию части таблицы и получить более быстрое время отклика.

Итак, я запутался.

Еще один вопрос: когда у меня есть «SELECT *», на что влияет некластеризованный индекс?


person pelopid    schedule 23.02.2018    source источник
comment
Что вы действительно спрашиваете? Этот вопрос крайне расплывчатый, и он просто бродит повсюду.   -  person Sean Lange    schedule 24.02.2018
comment
Запрос № 2 будет быстрее - просто потому, что вы выбираете только один столбец, а не все столбцы (при условии, конечно, что в вашей таблице есть больше, чем один column ....), и поэтому вам нужно передать намного меньше данных. Кроме того, для запроса № 2 вы можете выполнить запрос (выбрать все необходимые столбцы) непосредственно из некластеризованного индекса, а для запроса № 1 вам нужно будет выполнить поиск ключа для каждой найденной строки. (или, вполне возможно, SQL Server предпочтет игнорировать NCI и просто просканирует таблицу)   -  person marc_s    schedule 24.02.2018
comment
Проницательный вопрос для новичка в SQL-запросах. Концепция, которую описывают ваш вопрос и marc_s, называется «покрывающий индекс». Индекс покрывает или удовлетворяет запрос.   -  person Sql Surfer    schedule 24.02.2018
comment
Вы пробовали смотреть планы запросов?   -  person paparazzo    schedule 24.02.2018


Ответы (2)


1-й запрос :

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

2-й запрос :

Это будет быстрее, потому что он не будет извлекать столбцы, которые не являются частью индекса, хотя я рекомендую использовать покрывающий индекс.

Я рекомендую вам проверить это запись в блоге

person Ahmad.Tr    schedule 23.02.2018

Первый выбор будет использовать некластеризованный индекс для поиска ключа кластеризации [кластеризованный индекс существует] или страницы и слота [кластеризованный индекс отсутствует]. Затем это будет использоваться для получения строки. План запроса будет отличаться в зависимости от вашей STATS (данных).

Второй запрос «покрывается» некластеризованным индексом. Это означает, что некластеризованный индекс содержит все данные, которые вы выбираете. Ключ кластеризации не требуется, а кластеризованный индекс и/или куча не нужны для предоставления данных в список выбора.

person kalaolani    schedule 23.02.2018
comment
Один из способов думать, как обработчик запросов или реляционная машина, чтобы всегда знать, глядя на SQL, что произойдет, - это помнить порядок обработки... 1. ОТ 2. НА 3. ВНЕШНИЙ 4. ГДЕ 5. СГРУППИРОВАТЬ ПО 6. КУБ | ОБЪЯВЛЕНИЕ 7. ИМЕЮЩЕЕ 8. ВЫБРАТЬ 9. РАЗЛИЧНЫЕ 10 ЗАКАЗАТЬ ПО 11. ВЕРХНИЙ - person kalaolani; 24.02.2018