powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сервер не желает использовать фильтрованный индекс
46 сообщений из 46, показаны все 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
сервер не желает использовать фильтрованный индекс
    #40011381
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, то все равно лучше сканировать весь диапазон значений, чем его часть?

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
public partial class Transazioni
{
     public int IdVeicolo {get; set}
     public int IdCliente {get; set}
     public int Disabilitato {get; set}
     public long Tipo {get; set}
     ...
}



вот в случае если у них тип поля для Tipe объявлен в модели как long тогда при отправке запроса EF будет формировать SQL запрос приводящий значения к типу bigint

судя по самому SQL запросу у вас в EF модели код вида или что то подобное:
Код: c#
1.
2.
3.
4.
var context = new DbContext();
var excludeList = new List<int>() {7, 15, 16, 17, 19};
int id_cliente = 100;
var cnt = context.Transazioni.Where(o => o.Id == id_cliente && o.Disabilitato == 0 && !excludeList.Contains(o.Tipo)).Count();






меня еще если честно смущает что сервер во всех планах промахивается достаточно сильно в оценке строк по предикатам
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011384
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, то все равно лучше сканировать весь диапазон значений, чем его часть?



Если уникальных типов 100500 то лучше 1 раза просканировать весь дипазон, чем два почти полных скана (<15) (>19)

я понимаю, если бы условия был на in, но там же not in
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011385
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот как раз все остальные id типа IdVeicolo, IdCliente они все bigint.
так что там наверное везде long,
и для типа они скопировали, потому что копипаст наше все.
значит, надо переделать на int? так называется сиквельный int в их модели?
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011388
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123

значит, надо переделать на int? так называется сиквельный int в их модели?

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

значит, надо переделать на int? так называется сиквельный int в их модели?

да, но это уберет просто cast'ы не думаю что проблема именно в них

спасибо,
в понедельник скажу, что 2019-ый сервер не любит неправильные типы и что им это аукнется.
должно прокатить.
переехали на 2019 недавно, месяца не прошло, сюрпризов туча,
скажу, сервер не хочет их long, пускай переделывают
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011391
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

погодите, а если вы в студии выполняете
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @p__linq__0 bigint /*= какое то значение*/
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 (  [Extent1].[Tipo]  IN (7, 15, 16, 17, 18, 19)))
    )  AS [GroupBy1]



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

переехали на 2019 недавно, месяца не прошло, сюрпризов туча,

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

в их запросе никакое не declare, там параметр (имя сохранено)
генерит его EF.
и думаю, что все клиенты через это проходят.
а план один на всех, он у меня вылез в запросе на использование того индекса, который хочу дропнуть.

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

Брент есть мерзкий тип,
мы пересекались на стэке, наглая самодовольная свинья.
да достаточно комментарии к его статьям почитать, пока не зачистил неугодное.

а с 2019 вообще полный трэш:
хозяин барака решил какой-то там сертификат получить,
ему понадобился TDE.
а это только Энтерпрайз.
у них был 2012 Стандард, и решили они сразу перейти на 2019 Энтерпрайз.
говорю, может хоть 2016, хоть сп уже вышли?
не-не, хотим 2019 и все тут.
мигрировали вообще без тестирования приложения.
огребаем.
разгребаем.
под шумок попробуем избавиться от long.
в целом всплыло только дерьмо, полное OR.
ну так его давно пора было переписать.
теперь я им тоже говорю: кто напишет мне тучу OR, тому расстрел, сервер это найдет в 2 счета.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011406
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Yasha123,

погодите, а если вы в студии выполняете
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @p__linq__0 bigint /*= какое то значение*/
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 (  [Extent1].[Tipo]  IN (7, 15, 16, 17, 18, 19)))
    )  AS [GroupBy1]



он фильтрованный индекс подхватывает?

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

в том то и дело приведение к bigint мало влияет на выбор плана в данном случае.

а если попробовать сократить варианты интервала что бы он не строил merge interval скажем
попробовав построить план для такого варианта:

Код: 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 ( [Extent1].[Tipo] <> 7) 
    )  AS [GroupBy1]
option (recompile)



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

в том то и дело приведение к bigint мало влияет на выбор плана в данном случае.

а если попробовать сократить варианты интервала что бы он не строил merge interval скажем
попробовав построить план для такого варианта:

Код: 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 ( [Extent1].[Tipo] <> 7) 
    )  AS [GroupBy1]
option (recompile)




тоже не возьмет индекс?



Думаю, что нет.

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

да, согласен не успел написать.

поведение моделируется:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
/*
This query text was retrieved from showplan XML, and may be truncated.
*/

drop table if exists [Transazioni]
create table [Transazioni] (
[Id] bigint,
[IdCliente] bigint, 
[IdVeicolo] bigint,
[Disabilitato] bigint,
[Tipo] bigint,
[Status] bigint,
[StatusFatturazione] bigint
constraint PK primary key clustered ([Id] asc)
)
go
    CREATE NONCLUSTERED INDEX [ix_IdVeicolo_IdCliente_Disabilitato_Tipo_incl] ON [dbo].[Transazioni]
(
	[IdVeicolo] ASC,
	[IdCliente] ASC,
	[Disabilitato] ASC,
	[Tipo] ASC
)
INCLUDE ( 	[Status],
	[StatusFatturazione]) 
    go

create index ix_fltr_IdCliente_incl1
on Transazioni(IdCliente)
include(tipo, IdVeicolo)
where [IdVeicolo] IS NULL and [Disabilitato] = 0
go
update statistics Transazioni with rowcount=82198200
update statistics Transazioni(ix_IdVeicolo_IdCliente_Disabilitato_Tipo_incl) with rowcount=82198200

update statistics Transazioni(ix_fltr_IdCliente_incl1) with rowcount=285439
go

select * from sys.indexes where object_id = object_id('Transazioni')
select * from sys.partitions where object_id = object_id ('Transazioni')

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 [Extent1].[Tipo] <> 7
    --  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]
    option (recompile)

SELECT 


    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[Transazioni] AS [Extent1] with(index(ix_fltr_IdCliente_incl1))
        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]



в первом запросе выбирает [ix_IdVeicolo_IdCliente_Disabilitato_Tipo_incl]
это конечно "грубый тест", нет гистограмм по колонкам.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select @@VERSION

/*
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 
	Sep 24 2019 13:48:23 
	Copyright (C) 2019 Microsoft Corporation
	Express Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19041: ) (Hypervisor)

*/




add: хотя не, тест так себе поскольку для первого запроса он у меня не видит нормального кол-ва строк, походу статистики реально не хватает, гистограммы бы подтянуть :(
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011431
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
чем два почти полных скана (<15) (>19)
Глубоко не копал, но если так, то в предикате было бы два Seek - один только со Start, другой только с End, а там один со Stat и End.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011439
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
msLex
чем два почти полных скана (<15) (>19)
Глубоко не копал, но если так, то в предикате было бы два Seek - один только со Start, другой только с End, а там один со Stat и End.


Там два интервала, возвращаемые из merge interval, из-за чего index seek выполняется дважды.
По условию not in понятно, что интервалы будут максимально широкими, по другому просто не может быть.
А по количеству прочитанных (до predicate фильтра) данных, видно, что это дополнительный seek predicate по Tipo вообще ни чего не дает и там и там Number of Rows Read = 285439
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011444
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
граждане, у меня уже крыша едет,
объясните мне, зачем это EF приводит значения к типу bigint,
когда в таблице поле Tipo это int?


Он так по дефолту делает автогенератором, разработчики не лезут туда. Я тоже не мог понять, но проще забить, некогда было разбираться.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011497
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Там два интервала, возвращаемые из merge interval
Точно. Не обратил внимания.
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011502
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex

Исходный индекс достаточно хорош для запроса.
фильтрованный ничем не лучше.

фильтрованный лучше для меня и для процедур, меняющих данные.
он значительно меньше и в нем нет в ключе idVeicolo, который мееяется.
процедуры обновления данных стреляются от количества индексов на таблице.
вопрос вообще чисто академический.
похоже, просто заменю исходный индекс на нефильтрованный по idcliente.
раньше не было возможности на лету индексы менять,
чего сервер требовал, то и создавали ночью, в джобе.
сейчас есть online и compression, можно все переделать
и если не подошло, поменять назад не отходя от кассы.
всем спасибо за участие,
вчера же вечером фильтрованные индексы с условием is null
получили налловое поле в иклуд и процедуры избавились от хинтов, так что мы с сервером вас благодарим :)
...
Рейтинг: 0 / 0
сервер не желает использовать фильтрованный индекс
    #40011530
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

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


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