Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему оптимизатор отказывается использовать фильтрованый и covered индекс? / 21 сообщений из 21, страница 1 из 1
02.07.2019, 10:47
    #39832608
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Привет!

Есть огроменная таблица (30 GB где-то) под именем
Код: plaintext
     FileMetaData.File 

В этой таблице есть, креме прочих, поля:
Код: plaintext
     ID INT, Priority SMALLINT, HashSum VARBINARY(MAX) 

Есть фильтрованый индекс:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE INDEX [FileMetaData.File.IX.Priority+Id WHERE HashSum IS NULL] ON [FileMetaData].[File]
(
	[Priority] ASC
)
INCLUDE ([Id]) 
WHERE ([HashSum] IS NULL);



И есть простой запрос:
Код: sql
1.
2.
3.
SELECT COUNT(1) FROM FileMetaData.[File]
--WITH (INDEX([FileMetaData.File.IX.Priority+Id WHERE HashSum IS NULL]))
WHERE HashSum IS NULL;


И вот какого <CENSORED :-)> он выбирает стратегию "Clustered Index Scan"?
Причем, если я раскомментирую USE INDEX HINT, то всё еще хуже - он для каждой строки из индекса (делает "Index Scan" по нему), делает "Nested Loops"=>"Key Lookup" по кластерному индексу?

Почему просто не посчитать сколько листовых элементов в выше упомянутом индексе? Или вообще его статистику прочитать ...
...
Рейтинг: 0 / 0
02.07.2019, 10:53
    #39832611
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
План выполнения первого запроса
...
Рейтинг: 0 / 0
02.07.2019, 10:54
    #39832612
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri Abele,

COUNT(priority)?
...
Рейтинг: 0 / 0
02.07.2019, 10:54
    #39832613
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
План выполнения второго запроса
...
Рейтинг: 0 / 0
02.07.2019, 10:54
    #39832614
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Статистика (грубая) индекса
...
Рейтинг: 0 / 0
02.07.2019, 10:55
    #39832615
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
TaPaKYuri Abele,

COUNT(priority)?
Неа - то же, что и в первом плане выполнения
...
Рейтинг: 0 / 0
02.07.2019, 11:06
    #39832624
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Как вариант попробуйте на вычисляемом столбце фильтрованный индекс построить:

Код: sql
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE FileMetaData.[File] ADD IsEmptyHash AS IIF(HashSum IS NULL, 1, 0)
GO

CREATE INDEX ix2 ON FileMetaData.[File] ([Priority])
INCLUDE ([Id])
WHERE IsEmptyHash = 1
GO


Также если нужно чисто считать кол-во строк по индексу, то такой варик быстрее будет на порядок:

Код: sql
1.
2.
3.
4.
5.
SELECT SUM(p.[rows])
FROM sys.partitions p
JOIN sys.indexes i ON p.[object_id] = i.[object_id]
WHERE p.[object_id] = OBJECT_ID('FileMetaData.[File]')
    AND i.[name] = 'ix2'
...
Рейтинг: 0 / 0
02.07.2019, 11:06
    #39832627
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri Abele,

скан выбирает скорее всего из за количества, какое соотношение NULL/NOT NULL
...
Рейтинг: 0 / 0
02.07.2019, 11:08
    #39832628
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Потому что functionality gap
Надо добавлять HashSum в include.

UPD: ну или через вычисляемое поле, как советовали.
...
Рейтинг: 0 / 0
02.07.2019, 11:08
    #39832629
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Такое расширение добавит, как минимум, 4 байта на строку. А когда сотня миллионов, это уже чуствуется.
А NULL или NOT NULL - это только один бит в уже существующей маске
...
Рейтинг: 0 / 0
02.07.2019, 11:10
    #39832631
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Гавриленко Сергей АлексеевичПотому что functionality gap
Мда ..., нежиданно ...
...
Рейтинг: 0 / 0
02.07.2019, 11:11
    #39832632
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri AbeleТакое расширение добавит, как минимум, 4 байта на строку.
Кастуем в BIT получаем вместо 4 байтов - 1. Как вариант работать должно, опять же если нужно просто кол-во то лучше создать индекс но смотреть в метаданные.
...
Рейтинг: 0 / 0
02.07.2019, 11:13
    #39832636
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Sergey Syrovatchenko
Код: sql
1.
2.
3.
4.
5.
SELECT SUM(p.[rows])
FROM sys.partitions p
JOIN sys.indexes i ON p.[object_id] = i.[object_id]
WHERE p.[object_id] = OBJECT_ID('FileMetaData.[File]')
    AND i.[name] = 'ix2'


Ну да, это кусок из того, как тот же "Disk Usage By Table" работает. Это понятно, да и костыли я прикручу какие-нибудь. Хотелось просто понять, что за "№;%"№:", но коллега выше объяснил.
Еще бы понять, чего они это никак не зафиксят?...
...
Рейтинг: 0 / 0
02.07.2019, 11:14
    #39832638
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Sergey SyrovatchenkoКастуем в BIT получаем вместо 4 байтов - 1. Как вариант работать должно, опять же если нужно просто кол-во то лучше создать индекс но смотреть в метаданные.
И поле NOT NULL ...
хм, я подумаю, спасибо за идею!
...
Рейтинг: 0 / 0
02.07.2019, 11:18
    #39832643
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri AbeleSergey SyrovatchenkoКастуем в BIT получаем вместо 4 байтов - 1. Как вариант работать должно, опять же если нужно просто кол-во то лучше создать индекс но смотреть в метаданные.
И поле NOT NULL ...
хм, я подумаю, спасибо за идею!
Тогда уж наверное TINY INT и пихать туда до 256 комбинаций битов.
Дело в том, что у меня несколько подобных полей - MetaInfo например, там то, что через Windows API о файле вытащить можно (типа разрешения картинок или авторов документов)
...
Рейтинг: 0 / 0
02.07.2019, 11:22
    #39832644
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Если что у сиквела есть внутренняя оптимизация по хранению типа BIT - 8 колонок такого типа хранится в таблице как 1 байт.
...
Рейтинг: 0 / 0
02.07.2019, 11:24
    #39832647
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri AbeleГавриленко Сергей АлексеевичПотому что functionality gap
Мда ..., нежиданно ...Самое возмутительное, МС имеет наглость заявлять, что это какой то "gap", а не баг.
И эту бажищу не пофиксили до сих пор, с того обсуждения прошло уже 6 лет
...
Рейтинг: 0 / 0
02.07.2019, 11:32
    #39832657
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Sergey SyrovatchenkoЕсли что у сиквела есть внутренняя оптимизация по хранению типа BIT - 8 колонок такого типа хранится в таблице как 1 байт.
Так и я об этом! Этим-то и хотел пользоваться, когда фильтр по IS NULL в индекс запихал.
А так теперь дополнительное COMPUTED поле, которое будет материализовано наложенным индексом
...
Рейтинг: 0 / 0
02.07.2019, 11:42
    #39832663
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri Abele,

авторА так теперь дополнительное COMPUTED поле, которое будет материализовано наложенным индексом

А что даст без PERSIST в фильтр засунуть? Так что дважды материализовано
...
Рейтинг: 0 / 0
02.07.2019, 12:41
    #39832702
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
TaPaKYuri Abele,

авторА так теперь дополнительное COMPUTED поле, которое будет материализовано наложенным индексом

А что даст без PERSIST в фильтр засунуть? Так что дважды материализовано
Вы, похоже, не с начала читали. Хотелось сэкономить, а не новые байты в строчках отгрызать
...
Рейтинг: 0 / 0
02.07.2019, 12:43
    #39832703
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему оптимизатор отказывается использовать фильтрованый и covered индекс?
Yuri AbeleTaPaKYuri Abele,

пропущено...

А что даст без PERSIST в фильтр засунуть? Так что дважды материализовано
Вы, похоже, не с начала читали. Хотелось сэкономить, а не новые байты в строчках отгрызать
так я и говорю что с фильтрованным индексом сэкономить не получится, можно посмотреть в сторону индекисрованного представления но везде свои минусы
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему оптимизатор отказывается использовать фильтрованый и covered индекс? / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]