powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сервер не желает использовать фильтрованный индекс
21 сообщений из 46, страница 2 из 2
сервер не желает использовать фильтрованный индекс
    #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
21 сообщений из 46, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сервер не желает использовать фильтрованный индекс
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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