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

Откуда: Москва
Сообщений: 1176
есть табличка

CREATE TABLE [cache].[CatalogSlice]
(
	[ID]			[int]				IDENTITY(1,1) NOT NULL,
	[Catalog_ID]	[uniqueidentifier] NOT NULL,
	[Slice_Hash]	[uniqueidentifier] NOT NULL,
	[DateClosed]	[smalldatetime] NULL,
	[StartDate]		[datetime] NOT NULL,
	[EndDate]		[datetime] NOT NULL,
	[Variant_ID]	[uniqueidentifier] NOT NULL,
	[CalcDuration]	[int] NOT NULL,
	[CalcDate]		[smalldatetime] NOT NULL,

	CONSTRAINT [PK_CatalogSlice_ID] PRIMARY KEY CLUSTERED([ID] ASC)
)


есть запрос

select 
	Catalog_ID
from [cache].[CatalogSlice] with(index = IXF_CatalogSlice__CatalogID_SliceHash_Incl_StartDate)
where 
	Catalog_ID = '3478CD0F-DAAB-428F-AFFA-2578D508F1B0' and Slice_hash = '7076CB3D-D0EC-06B6-23D1-058D9441B2BA' and DateClosed is null

select 
	ID
from [cache].[CatalogSlice] 
where 
	Catalog_ID = '3478CD0F-DAAB-428F-AFFA-2578D508F1B0' and Slice_hash = '7076CB3D-D0EC-06B6-23D1-058D9441B2BA' and DateClosed is null



если делаем так

create unique index IXF_CatalogSlice__CatalogID_SliceHash_Incl_StartDate 
	on [cache].[CatalogSlice]([Catalog_ID], [Slice_Hash], [DateClosed]) 
		where (DateClosed is null)


+ хинтуем индекс, то у нас лукап за кластерным ключем!!!

если делаем

create unique index IXF_CatalogSlice__CatalogID_SliceHash_Incl_StartDate 
	on [cache].[CatalogSlice]([Catalog_ID], [Slice_Hash], [DateClosed])
		where (DateClosed is null)


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

К сообщению приложен файл. Размер - 27Kb
28 сен 16, 19:17    [19720235]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) 
	Mar 19 2015 12:32:14 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


К сообщению приложен файл. Размер - 5Kb
28 сен 16, 19:18    [19720243]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Собсвенно вопрос.
Почему фильтрованный покрывающий индекс перестает быть покрывающим
28 сен 16, 19:19    [19720255]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4680
Mike_za
Собсвенно вопрос.
Почему фильтрованный покрывающий индекс перестает быть покрывающим


Попробуйте в дате вместо NULL использовать большой значение -- '9999-12-31' и т.п.
28 сен 16, 19:29    [19720305]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
invm
Member

Откуда: Москва
Сообщений: 9270
Mike_za,

Не вижу разницы в индексах между "если делаем так" и "если делаем".
Соответственно, второй запрос возвращает ID, а не Catalog_ID и сканировать кластерный оказалось выгоднее.
28 сен 16, 19:40    [19720356]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
Уже было
Если коротко: MS не смог сделать нормально и не считает это проблемой
28 сен 16, 19:58    [19720428]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
invm,

Ну скрины с правильными запросами были.
28 сен 16, 20:56    [19720661]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Гавриленко Сергей Алексеевич,

Спасибо! Тема исчерпана
28 сен 16, 20:56    [19720664]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
aleks2
Guest
Mike_za
Спасибо! Тема исчерпана

А нафига , [DateClosed]) в фильтрованном индексе?

create unique index IXF_CatalogSlice__CatalogID_SliceHash_Incl_StartDate 
	on [cache].[CatalogSlice]([Catalog_ID], [Slice_Hash], [DateClosed]) 
		where (DateClosed is null)


Оно же DateClosed is null.
Это такое тонкое извращение?
29 сен 16, 06:47    [19721577]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
aleks2,

Вот именно такой вариант покрывает запрос
29 сен 16, 10:34    [19722205]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
aleks2
А нафига , [DateClosed]) в фильтрованном индексе?

create unique index IXF_CatalogSlice__CatalogID_SliceHash_Incl_StartDate 
	on [cache].[CatalogSlice]([Catalog_ID], [Slice_Hash], [DateClosed]) 
		where (DateClosed is null)



Оно же DateClosed is null.
Это такое тонкое извращение?
Чувствуется, Алекс в теме. (нет)

З.Ы. Поле можно пихать в инклуд, кстати.

Сообщение было отредактировано: 29 сен 16, 10:59
29 сен 16, 10:58    [19722397]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
aleks2
Guest
Гавриленко Сергей Алексеевич
aleks2
А нафига , [DateClosed]) в фильтрованном индексе?

create unique index IXF_CatalogSlice__CatalogID_SliceHash_Incl_StartDate 
	on [cache].[CatalogSlice]([Catalog_ID], [Slice_Hash], [DateClosed]) 
		where (DateClosed is null)



Оно же DateClosed is null.
Это такое тонкое извращение?
Чувствуется, Алекс в теме. (нет)

З.Ы. Поле можно пихать в инклуд, кстати.


Пихать то можно.
Вопрос: занафига?
29 сен 16, 11:55    [19722782]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
aleks2
Гавриленко Сергей Алексеевич
пропущено...
Чувствуется, Алекс в теме. (нет)

З.Ы. Поле можно пихать в инклуд, кстати.


Пихать то можно.
Вопрос: занафига?
Тему почитай, ссылки потыкай, планы посмотри, если не пихать.
29 сен 16, 12:46    [19723152]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
aleks2
Guest
Гавриленко Сергей Алексеевич
aleks2
пропущено...


Пихать то можно.
Вопрос: занафига?
Тему почитай, ссылки потыкай, планы посмотри, если не пихать.


Тему читал, ссылки тыкал. Планы не смотрел - ибо нема смысла.

Дык, зачем?
Это поле используется только в условии отбора.
Этого условия достаточно, чтобы оптимизатор использовал фильтрованный индекс.
Больше это поле нигде не нужно.
И не может ваще НИКОГДА понадобиться , при использовании фильтрованного индекса.

Тема не раскрыта.
29 сен 16, 12:55    [19723235]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
aleks2
Гавриленко Сергей Алексеевич
пропущено...
Тему почитай, ссылки потыкай, планы посмотри, если не пихать.


Тему читал, ссылки тыкал. Планы не смотрел - ибо нема смысла.

Дык, зачем?
Это поле используется только в условии отбора.
Этого условия достаточно, чтобы оптимизатор использовал фильтрованный индекс.
Больше это поле нигде не нужно.
И не может ваще НИКОГДА понадобиться , при использовании фильтрованного индекса.

Тема не раскрыта.
Если в указанном кейсе не добавлять поле в индекс явно, то сервер за каким-то хреном лукапает его значение из кластерного индекса. Отсюда две неприятности: в два раза больше лукапов при точечном поиске, и большая вероятность того, что сервер забьет на фильтрованный индекс и решит, что ему выгоднее сканить кластерный.

Сообщение было отредактировано: 29 сен 16, 13:19
29 сен 16, 13:19    [19723388]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
в теории Алекс прав

автор
A column in the filtered index expression should be a key or included column in the filtered index definition if the query predicate uses the column in a comparison that is not equivalent to the filtered index expression.


но из за определения на IS NULL считается случай

автор
A column in the filtered index expression should be a key or included column in the filtered index definition if the query predicate uses the column in a comparison that is not equivalent to the filtered index expression.

я так понимаю что c IS NOT NULL такого не будет
29 сен 16, 13:28    [19723443]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
TaPaK,
тут написано елси выражение отличается. Но оно же не отличается?
23 май 17, 15:56    [20504791]     Ответить | Цитировать Сообщить модератору
 Re: Покрывающий фильтрованный индекс  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Mike_za
TaPaK,
тут написано елси выражение отличается. Но оно же не отличается?

не очень осмысленно написано, речь про саму проверку на IS NULL VS IS NOT NULL.
т.е. индекс DateClosed IS NOT NULL не потребует включения поля в индекс
23 май 17, 16:34    [20504923]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить