powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сервер не желает использовать фильтрованный индекс
25 сообщений из 46, страница 1 из 2
сервер не желает использовать фильтрованный индекс
    #40011318
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеется здоровенная таблица с вот таким индексом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE NONCLUSTERED INDEX [ix_IdVeicolo_IdCliente_Disabilitato_Tipo_incl] ON [dbo].[Transazioni]
(
	[IdVeicolo] ASC,
	[IdCliente] ASC,
	[Disabilitato] ASC,
	[Tipo] ASC
)
INCLUDE ( 	[Status],
	[StatusFatturazione]) 



в принципе он подходит, но он тоже большой, хоть и компресснутый.

а EF долбит сервер вот таким вот шедевром:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @p__linq__0 bigint = 1

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[Transazioni] AS [Extent1]
        WHERE ([Extent1].[IdCliente] = @p__linq__0) 
		       AND (0 = [Extent1].[Disabilitato]) 
			   AND ([Extent1].[IdVeicolo] IS NULL) 
			   AND ( NOT ( CAST( [Extent1].[Tipo] AS bigint) IN (cast(7 as bigint), cast(15 as bigint), cast(16 as bigint), cast(17 as bigint), cast(18 as bigint), cast(19 as bigint))))
    )  AS [GroupBy1]



создаю ему вот такой индекс:

Код: sql
1.
2.
3.
4.
create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente)
include(tipo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0



он крошечный, но сервер его не берет.
прописываю его хинтом, он тогда использует,
но лезет в ПК за IdVeicolo.
что вообще-то против всякой логики: если он не верит, что [IdVeicolo] IS NULL,
то не должен пользоваться этим индексом вообще,
должен кричать, что план из-за хинта создать не может.
а раз может, то чего лезет в ПК?

но черт с ним, я ему добавляю IdVeicolo в инклуд.
не, не берет все равно.
хинтом прописываю, в ПК уже не лезет, запрос выполняется быстрее,
чем если брать нефильтрованный индекс, но ведь не берет и все,
да еще и несусветную стоимость птиписывает хинтованному запросу.
вопрос: почему?

прилагаю планы актуальные.
первый с указанным фильтрованным индексом,
второй с переделанным индексом, вот таким:

Код: sql
1.
2.
3.
4.
create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente)
include(tipo, IdVeicolo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0



plan1
plan2
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011319
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вникал в планы, но, по всей видимости, проблема тут


Код: sql
1.
where [IdVeicolo] IS NULL



Добавьте это поле в inclued секцию.
Без этого фильтрованный индекс на is null не работает.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011320
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Не вникал в планы, но, по всей видимости, проблема тут


Код: sql
1.
where [IdVeicolo] IS NULL




Добавьте это поле в inclued секцию.
Без этого фильтрованный индекс на is null не работает.



Опс, это вы уже сделали, но без хинта индекс не используется

Тогда нужно смотреть планы.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011321
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так вот, второй план показывает, как он не желает брать переделанный индекс,
в который как раз и добавлено IdVeicolo:
Код: sql
1.
2.
3.
4.
create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente)
include(tipo, IdVeicolo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0



не берет, и стоимость ему насчитывает офигенную
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011323
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мб
Код: sql
1.
2.
3.
4.
create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente, IdVeicolo, Disabilitato)
include(tipo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011324
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex

Тогда нужно смотреть планы.

планы не лезут без архивации, у меня ссылки на брентозаровскую вставлялку планов
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011328
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel
мб
Код: sql
1.
2.
3.
4.
create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente, IdVeicolo, Disabilitato)
include(tipo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0


и этот тоже не берет,
хотя уже считает, что стоимость 50х50
plan3
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011329
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за [FLEETXS].[dbo].[Transazioni].[ix_fltr_datainserimento]?

Он почему-то попал в unmatched indexes
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011331
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
А что за [FLEETXS].[dbo].[Transazioni].[ix_fltr_datainserimento]?

Он почему-то попал в unmatched indexes

ну есть такой, да, только совсем не под этот запрос:

Код: sql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [ix_fltr_datainserimento] ON [dbo].[Transazioni]
(
	[DataInserimento] ASC
)
WHERE ([status]<>(12) AND [disabilitato]=(0) AND [IdDispositivo] IS NULL AND [idcliente] IS NOT NULL AND [statusfatturazione]=(14))
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011334
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и да, надо в него тоже в инклуд IdDispositivo воткнуть,
его он тоже не брал добровольно и он у меня хинтом прописан.
там все же sp, а не сгенеренный бред от EF
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011337
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

покажите определение кластерного индекса еще

и желательно гистограмму колонок Id и IdCliente

вообще там же еще переменная он может с вектор плотности вместо гистограммы использовать.
можете как то к запросу вкорячить option (recompile) или optimize for (@p__linq__0 = const) ?
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011339
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем не понятно, что за дичь происходит перед index seek в первом запросе второго плана.

Ведь выбираемый индекс просто идеально подходит под запрос, и должен быт 1 index seek (что и ожидает сервер), а по факту происходит 2(!).


Может где с типами параметров и полей несоответствие?
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011343
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Совсем не понятно, что за дичь происходит перед index seek в первом запросе второго плана.

Ведь выбираемый индекс просто идеально подходит под запрос, и должен быт 1 index seek (что и ожидает сервер), а по факту происходит 2(!).


Может где с типами параметров и полей несоответствие?

Так, стало понятней


Он вот эту портянку в NOT( ... in) пытается преобразовать в интервалы, а их использовать для более точного index seek по всем 4-м полям индекса.

а вот этот тот первый индекс конкретно по этот запрос сделан?
можно ли для эксперимента убрать из ключа (перенеся в include) последнее поле?
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011345
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

еще интересно проверить что будет если ему побольше время дать на подсчет плана,

сколько он будет подбирать что бы ушло StatementOptmEarlyAbortReason="GoodEnoughPlanFound"

если можете проэкспериментировать с каким нибудь тестом (querytraceon 8780 querytraceon 8671)
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011346
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex

а вот этот тот первый индекс конкретно по этот запрос сделан?
можно ли для эксперимента убрать из ключа (перенеся в include) последнее поле?

первый индекс не только под этот запрос, там еще StatusFatturazione,
помониторю еще в день Fatturazione, это будет 8-ого числа,
а так у меня руки чешутся дропнуть первый индекс,
на данный момент его только этот запрос использует.
хотим перенести Tipo в инклуд?
сейчас сделаю на копии базы.

кстати, если наоборот во втором индексе занести Tipo в ключ,
то все равно не берет, хотя и насчитывает ему меньшую стоимость (52 x 48)

plan4
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011347
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Yasha123,

покажите определение кластерного индекса еще

и желательно гистограмму колонок Id и IdCliente

вообще там же еще переменная он может с вектор плотности вместо гистограммы использовать.
можете как то к запросу вкорячить option (recompile) или optimize for (@p__linq__0 = const) ?

кластеред там тупее некуда,
Код: sql
1.
2.
3.
4.
ALTER TABLE [dbo].[Transazioni] ADD  CONSTRAINT [PK_Transazioni] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)


(id int identity)
вкорячить туда recompile не выйдет, это генерит EF,
но если это в студии вкорячить, результат не меняется, уже проверено
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011348
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
хотим перенести Tipo в инклуд?
сейчас сделаю на копии базы.


Да, это должно отбить охоту от построения этих ненужных интервалов. В этом случае скорость работы с первым индексом должна сравнятся со вторым (это при прочих равных типа FG, кеширование и т.п.)

Yasha123
кстати, если наоборот во втором индексе занести Tipo в ключ,


Это приводит к такому-же плану, что и в исходном варианте, т.е. скорость выполнения должна упасть.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011349
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первоначально seek predicates для запроса с обычным индексом гораздо точнее, чем для запроса с фильтрованным. Как раз за счет tipo в ключе индекса и применения "ненужного" merge interval.
Это видно по значениям Estimated Number of Rows to be Read в планах. Отсюда и бОльшая стоимость запроса с фильтрованным.

Поэтому показано добавление IdDispositivo и tipo в ключ фильтрованного.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011350
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот план при индексах:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente, IdVeicolo)
include(tipo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0
with(online = on)

CREATE NONCLUSTERED INDEX [ix_IdVeicolo_IdCliente_Disabilitato_Tipo_incl] ON [dbo].[Transazioni]
(
	[IdVeicolo] ASC,
	[IdCliente] ASC,
	[Disabilitato] ASC
)
INCLUDE ( 	[Status],
	[StatusFatturazione],
	[Tipo] ) 
	WITH (DROP_EXISTING = ON)


plan5
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011354
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Поэтому показано добавление IdDispositivo и tipo в ключ фильтрованного.


IdDispositivo в ключе полностью нивелируется IdDispositivo = 0 в условиях фильтрованного индекса

а интервалы фильтрации по tipo для условия
Код: sql
1.
AND ( NOT ( CAST( [Extent1].[Tipo] AS bigint) IN (cast(7 as bigint), cast(15 as bigint), cast(16 as bigint), cast(17 as bigint), cast(18 as bigint), cast(19 as bigint))))

выглядят просто сюром.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011359
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Yasha123,

еще интересно проверить что будет если ему побольше время дать на подсчет плана,

сколько он будет подбирать что бы ушло StatementOptmEarlyAbortReason="GoodEnoughPlanFound"

если можете проэкспериментировать с каким нибудь тестом (querytraceon 8780 querytraceon 8671)

мне кажется, времени ему хватает,
но вот план с флагами:
plan6
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011365
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
граждане, у меня уже крыша едет,
объясните мне, зачем это EF приводит значения к типу bigint,
когда в таблице поле Tipo это int?
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011367
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
а интервалы фильтрации по tipo для условия
Код: sql
1.
AND ( NOT ( CAST( [Extent1].[Tipo] AS bigint) IN (cast(7 as bigint), cast(15 as bigint), cast(16 as bigint), cast(17 as bigint), cast(18 as bigint), cast(19 as bigint))))


выглядят просто сюром.
Т.е., если уникальных tipo, допустим, 100500, то все равно лучше сканировать весь диапазон значений, чем его часть?
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011370
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
граждане, у меня уже крыша едет,
объясните мне, зачем это EF приводит значения к типу bigint,
когда в таблице поле Tipo это int?


а у вас для модели EF структура ссылающаяся на таблицу не определена случаем как long?


а интервалы фильтрации по tipo для условия
AND ( NOT ( CAST( [Extent1].[Tipo] AS bigint) IN (cast(7 as bigint), cast(15 as bigint), cast(16 as bigint), cast(17 as bigint), cast(18 as bigint), cast(19 as bigint))))
выглядят просто сюром.


там же предикат на неравеноство, он для этого отрезки и составляет
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011376
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff

а у вас для модели EF структура ссылающаяся на таблицу не определена случаем как long?

да кто их знает.
я не трогаю их код,
а им сказано не трогать серверный.
попробую спросить, но уже в понедельник.
думаю, никто даже не пошевелится.
что работает, к тому не прикасаются
---
а скажите, плиз, в их терминах, как надо переопределить?
попробую начальство загрузить, сразу нужный тип указав
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сервер не желает использовать фильтрованный индекс
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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