SQL Server 2008 Index Optimization - кластерный поиск против некластеризированного включения

StackOverflow https://stackoverflow.com/questions/7317032

Вопрос

Это долгий, вовлеченный вопрос об теории оптимизации индекса. Это не домашнее задание, хотя я впервые познакомился с этим вопросом на примере экзамена на 70-432 Microsoft. Первоначальный вопрос был об общей оптимизации запросов, но затем я нашел это своеобразное поведение, которое я не мог объяснить.

Во -первых, таблица:

CREATE TABLE Invoice_details (
Invoice_id int NOT NULL,
Customer_id int NOT NULL,
Invoice_date datetime DEFAULT GETDATE() NULL,
Amount_total int NULL,
Serial_num int IDENTITY (1,1) NOT NULL)

Теперь кластерный индекс и два индекса для тестирования:

CREATE UNIQUE CLUSTERED INDEX [ix_serial] ON [dbo].[Invoice_details] ([Serial_num] ASC)
/* Below is the "original" index */
CREATE NONCLUSTERED INDEX [ix_invoice_customer] ON [dbo].[Invoice_details] 
    ([Invoice_id] ASC,[Customer_id] ASC)
/* Below is the "optimized" index (adds one included field) */
CREATE NONCLUSTERED INDEX [ix_invoice_customer_inc] ON [dbo].[Invoice_details] 
    ([Invoice_id] ASC,[Customer_id] ASC) INCLUDE ([Invoice_date])

Я также добавил несколько случайных тестовых данных в таблицу - 100000 строк. Insoice_id, customer_id и summator_total получали свои собственные случайные значения (диапазон 1000-9999), а infuice_date получил getDate () плюс случайное количество секунд (диапазон 1000-9999). Я могу предоставить фактическую рутину, которую я использовал, но не думал, что специфика будет актуальной.

И, наконец, запрос:

SELECT Invoice_id,Customer_id,Invoice_date FROM Invoice_details WHERE Customer_id=1234;

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

Какой индекс приводит к более быстрому исполнению, и почему?

Это было полезно?

Решение

Это зависит ... от переломный момент.

Другие советы

Предполагая, что нет таких проблем, как фрагментация, все сводится к селективности запроса.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top