Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почему не используется индекс?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
CREATE VIEW dbo.vw_IntexTest 
WITH SCHEMABINDING 
AS
SELECT F2, UI, HCC 
FROM dbo.tbl_Index_Test
WHERE ID <= 10000; 
GO
CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON dbo.vw_IntexTest (F2, UI, HCC);
GO
SELECT F2, UI, HCC
FROM dbo.vw_IntexTest WITH (INDEX(IDX_V1))
WHERE F2 = '0000000319' 


Даже с хинтом он использует кластерный индекс на таблице и не хочет использовать IDX_V1.

Что делаю не так?
25 окт 13, 23:22    [15034981]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Оптимизатор счел запрос тривиальным. И развернул представление до базовой таблицы. Вот так пробуйте:
SELECT F2, UI, HCC
FROM dbo.vw_IntexTest WITH (NOEXPAND)
WHERE F2 = '0000000319'
25 окт 13, 23:31    [15035024]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Да, спасибо, так работает.

А что нужно оптимизатору что-б он счёл запрос нетривиальным?
25 окт 13, 23:42    [15035083]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
SandalTree
А что нужно оптимизатору что-б он счёл запрос нетривиальным?
Если для запроса можно построить только единственный план или единственный заведомо наилучший план, то он будет сочтен тривиальным.
26 окт 13, 00:19    [15035221]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm
WITH (NOEXPAND)
Как я помню, NOEXPAND делается автоматом только для Enterprise версий.
26 окт 13, 00:22    [15035243]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А ещё если данных мало или статистика кривая ...
26 окт 13, 00:23    [15035248]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
invm
WITH (NOEXPAND)
Как я помню, NOEXPAND делается автоматом только для Enterprise версий.
Хорошо, попробую в Enterprise.

Кстати.
SET STATISTICS IO ON
GO
SELECT UI, Amount
FROM dbo.vw_IntexTest (NOEXPAND)
WHERE UI in ('51', '62', '73', '84', '95', '16', '27', '38', '49', '5A', '6B', '7C', '8D', '9E', '1F', '20'); 
GO
SELECT UI, Amount
FROM dbo.vw_IntexTest WITH (FORCESCAN, NOEXPAND)
WHERE UI in ('51', '62', '73', '84', '95', '16', '27', '38', '49', '5A', '6B', '7C', '8D', '9E', '1F', '20'); 
GO
SET STATISTICS IO OFF
автор
(16 row(s) affected)
Table 'vw_IntexTest'. Scan count 16, logical reads 32, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(16 row(s) affected)
Table 'vw_IntexTest'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


И это при том что страница индекса всего одна:
SELECT page_count, record_count 
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('vw_IntexTest'), NULL, NULL, 'DETAILED') 
автор

page_count record_count
1 256


Интересно что "Scan count 16, logical reads 32" влияет на производительность в лучшую сторону.
При одинаковом Query Cost первый запрос отрабатывает в 6 раз быстрее.

Кто-то обьяснит как такое может быть?
26 окт 13, 02:04    [15035539]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
А ещё если данных мало или статистика кривая ...
Данных 100К, тестовые, только залил.
26 окт 13, 02:05    [15035542]     Ответить | Цитировать Сообщить модератору
 Re: Почему не используется индекс?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
invm
SandalTree
А что нужно оптимизатору что-б он счёл запрос нетривиальным?
Если для запроса можно построить только единственный план или единственный заведомо наилучший план, то он будет сочтен тривиальным.
Разница по сравнению с NOEXPAND примерно 300 раз по скорости.
26 окт 13, 02:07    [15035547]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить