powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Фильтрованный индекс не используется в запросе.
23 сообщений из 23, страница 1 из 1
Фильтрованный индекс не используется в запросе.
    #39820150
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть код
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @InVarId1 int = 4848 -- Давл. на фильеру экструдера
DECLARE @LastValue float
DECLARE @LastDate datetime

Select Top 1 @LastValue = Result, @LastDate = Result_On From [SOADB].[dbo].[Test_History]
Where Var_Id = @InVarId1
--And datepart(minute, Result_On) = 0
--Отсекаем секунды вместо минут, в следующих переменных по аналогии.
And datepart(SECOND, Result_On) = 0 
Order By Result_On Desc


И есть индекс ~70ГБ
Код: plsql
1.
2.
3.
4.
CREATE NONCLUSTERED INDEX [TestHistory_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])


Решил сделать оптимизацию. Так как @InVarId1 принимает ограниченный набор значений (4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496)
Решил создать фильтрованный индекс И есть индекс ~200МБ
Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory1_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])
WHERE (([Var_Id] IN ((4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496))))


Но запрос не хочет его использовать. Отключаю [TestHistory_IX_VarIdResultOn] и поиск начинается по кластерному индексу.
Когда добавляю к запросу подсказку
Код: plsql
1.
WITH (INDEX(TestHistory1_IX_VarIdResultOn))


Выдает ошибку
Код: sql
1.
Обработчик запросов не может предоставить план запроса из-за подсказок, определенных в запросе. Заново запустите запрос без указания подсказок и без использования SET FORCEPLAN.


То есть [TestHistory1_IX_VarIdResultOn] вообще индекс не хочет использовать.
Нужно чтобы без подсказки все заработало, код переписывать не могу. могу ток индексы создавать, удалять.
Для чего нужно, индекс [TestHistory_IX_VarIdResultOn] используется только этим запросом, весит много, хотелось бы сократить объем да и быстрее будет по второму, ток вот понять не могу почему не работает.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820158
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл указать
Microsoft SQL Server Standard (64-bit) 11.0.7001.0
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820167
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOНужно чтобы без подсказки все заработало, код переписывать не могу. могу ток индексы создавать, удалять.Даже не представляю, как сделать, что бы заработало без изменения запросов... Чтоб можно было option(recompile) добавить (тогда можно не указывать индекус, он сам подцепит)
Тут же смысл в том, что сервер не строит план для конкретного значения, он строит план для типового варианта, и сохраняет, а типовой вариант не может использовать ваш фильтрованный индекс, потому что значение переменной в условии не фиксировано.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820172
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

когда делаю
Код: plsql
1.
2.
3.
4.
5.
6.
Select Top 1 @LastValue = Result, @LastDate = Result_On From [SOADB].[dbo].[Test_History]
Where Var_Id = 4848
--And datepart(minute, Result_On) = 0
--Отсекаем секунды вместо минут, в следующих переменных по аналогии.
And datepart(SECOND, Result_On) = 0 
Order By Result_On Desc

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

Получается сократить объем индекса не получится, так как фильтр будет работать ток по явно заданному значению и при условии задания подсказки какой индекс использовать?
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820175
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSO[/src]
Решил сделать оптимизацию. Так как @InVarId1 принимает ограниченный набор значений (4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496)
Решил создать фильтрованный индекс И есть индекс ~200МБ
Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory1_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])
WHERE (([Var_Id] IN ((4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496))))




Чтобы оптимизатор применил фильтрованный индекс, надо в условии запроса ЯВНО повторить условие фильтрации индекса
Код: sql
1.
2.
WHERE (([Var_Id] IN ((4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496))))
                    and ...
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820177
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

то есть я не правильно сделал индекс?
Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory1_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])
WHERE ([Var_Id] = 8496)


и так для каждого значения?
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820182
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

то есть я не правильно сделал индекс?
Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory1_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])
WHERE ([Var_Id] = 8496)


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

то есть я не правильно сделал индекс?
Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory1_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])
WHERE ([Var_Id] = 8496)


и так для каждого значения?
Чем тебя не устраивает список?
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820184
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
но я не могу повторить
Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory4848_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On]Desc)
INCLUDE ([Result], [Entry_On])
WHERE ([Var_Id] = 4848 And datepart(SECOND, Result_On) = 0 )


а так создается

Код: plsql
1.
2.
3.
4.
5.
CREATE NONCLUSTERED INDEX [TestHistory4848_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On]Desc)
INCLUDE ([Result], [Entry_On])
WHERE ([Var_Id] = 4848 )


Но при выполнении
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @InVarId1 int = 4848 -- Давл. на фильеру экструдера
DECLARE @LastValue float
DECLARE @LastDate datetime

Select Top 1 @LastValue = Result, @LastDate = Result_On From [SOADB].[dbo].[Test_History]
Where Var_Id = 4848 
--And datepart(minute, Result_On) = 0
--Отсекаем секунды вместо минут, в следующих переменных по аналогии.
And datepart(SECOND, Result_On) = 0 
Order By Result_On Desc


Индекс все равно не используется.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820185
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
WHERE (([Var_Id] IN ((4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496))))
                    and [Var_Id] = @Var_Id
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820186
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOкогда делаю
Код: plsql
1.
2.
3.
4.
5.
6.
Select Top 1 @LastValue = Result, @LastDate = Result_On From [SOADB].[dbo].[Test_History]
Where Var_Id = 4848
--And datepart(minute, Result_On) = 0
--Отсекаем секунды вместо минут, в следующих переменных по аналогии.
And datepart(SECOND, Result_On) = 0 
Order By Result_On Desc


все равно не берет, но правда подсказка начинает работать. И тогда нужный индекс берет, но тут я явно его задал.
а без явного задания его можно чтобы его брал?У меня берёт без подсказки с явным указанием индекса

При этом у меня нет большого индекса. У вас он есть, или нет? Если есть, то сервер его и использует, он ведь не хуже, по большому счёту.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820191
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

А разве в индекс фильтр такой можно добавлять (у меня ругается)?
или вы предлагаете его в select добавить?
все равно не использует данный индекс.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820194
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Да есть, то есть SQL считает что время поиска в обоих случаях одинаковое будет и берет что нравится (на данный момент большой индекс)

То есть не получится про анализировать, что большой индекс больше не востребован и его можно удалить.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820206
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOaleks222,

А разве в индекс фильтр такой можно добавлять (у меня ругается)?
или вы предлагаете его в select добавить?
все равно не использует данный индекс.
В запрос.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820230
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

А вот тут и проблема что я не могу менять процедуры :(

в MSSSQL есть типа такого что если встречает
Код: plsql
1.
2.
3.
4.
5.
6.
Select Top 1 @LastValue = Result, @LastDate = Result_On From [SOADB].[dbo].[Test_History]
Where Var_Id = @InVarId1
--And datepart(minute, Result_On) = 0
--Отсекаем секунды вместо минут, в следующих переменных по аналогии.
And datepart(SECOND, Result_On) = 0 
Order By Result_On Desc


подменяет на
Код: plsql
1.
2.
3.
4.
5.
6.
7.
Select Top 1 @LastValue = Result, @LastDate = Result_On From [SOADB].[dbo].[Test_History]
Where (([Var_Id] IN ((4848), (4849), (4873), (4874), (8326), (8327), (8495), (8496)))) and 
Var_Id = @InVarId1
--And datepart(minute, Result_On) = 0
--Отсекаем секунды вместо минут, в следующих переменных по аналогии.
And datepart(SECOND, Result_On) = 0 
Order By Result_On Desc


Если есть то статью или где почитать можно (если возможность есть такая то буду искать).
А если нету такой возможности то жаль.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820247
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOИ есть индекс ~70ГБ
Код: plsql
1.
2.
3.
4.
CREATE NONCLUSTERED INDEX [TestHistory_IX_VarIdResultOn]
ON [dbo].[Test_History]
([Var_Id] , [Result_On] DESC)
INCLUDE ([Result], [Entry_On])

И вы уверены, что данный индекс используется исключительно для показанного запроса?
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820268
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фильтрованный индекс не используется для оптимизации, если включена принудительная параметризация в настройках базы.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820363
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSO,

Сделайте принудительное обновление статистики
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820426
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOДа есть, то есть SQL считает что время поиска в обоих случаях одинаковое будет и берет что нравится (на данный момент большой индекс)

То есть не получится про анализировать, что большой индекс больше не востребован и его можно удалить.Если с подсказкой использует, то и без подсказки будет, если большой индекс удалить.

Другое дело, что большой индекс может использоваться где то ещё, в других запросах.

VicSOв MSSSQL есть типа такого что если встречает
...
подменяет наНет, такого нет.
Если вы не можете менять процедуры (запросы), то задача не решаема, придётся оставить большой индекс.
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820524
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
на 90%, так как провожу на тестовом, а он как известно на все 100% не может быть объективным.
Хотел создать на боевой базе и потом проанализировать есть обращения к большому индексу и если нету то и грохнуть его.
А по факту так не получится, надо быть уверенным на 100% что он не нужен и грохать, а как это сделать не понятно.

Владислав Колосов,
Так без разнице что стоять будет в базе так как он уже с параметром запрос

a_voronin,
Первое что и делаю после создания удаления индексов.
alexeyvg,

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

Кстати может знаете есть ли какие-то интересные статьи как по оптимизации, создания индексов без вмешательство в сам код?
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820525
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOКстати может знаете есть ли какие-то интересные статьи как по оптимизации, создания индексов без вмешательство в сам код?
Опять кнопку [Сделать фсе как я хачу] ищем?

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

1. Обычный сработает с той же скоростью.
2. Великой экономии памяти тоже не ожидается.
Нафига?
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820557
VicSO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Дисковое пространство экономия 100 кратное.
Жмотятся на пространство, я как пришло тут постоянно шринт делали что логов что баз. Сначала ребиллд, а потом шринк, и толк от этого?
вот путаюсь поменять ситуацию. Пытаюсь как-то выиграть пространство, уже один индекс нашел на 100гб :) не кому на хрен не нужный удалили. Теперь хоть куда-то расти есть базе. но боюсь это не на долго прирост где-то 1,2ГБ/в день, сейчас в лучшем случае хватит на 200-300 дней :) и все приплыли.
Раз больше дельных советов нету, будем пробовать другой подход выбивания пространства. Не хотите чтобы все встало нужно увеличить объем диска :)
Я пока исчерпал свои ресурсы (раз фильтрованный индексом не получилось, то все)
...
Рейтинг: 0 / 0
Фильтрованный индекс не используется в запросе.
    #39820587
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VicSOaleks222,

Дисковое пространство экономия 100 кратное.
Жмотятся на пространство, я как пришло тут постоянно шринт делали что логов что баз. Сначала ребиллд, а потом шринк, и толк от этого?
вот путаюсь поменять ситуацию. Пытаюсь как-то выиграть пространство, уже один индекс нашел на 100гб :) не кому на хрен не нужный удалили. Теперь хоть куда-то расти есть базе. но боюсь это не на долго прирост где-то 1,2ГБ/в день, сейчас в лучшем случае хватит на 200-300 дней :) и все приплыли.
Раз больше дельных советов нету, будем пробовать другой подход выбивания пространства. Не хотите чтобы все встало нужно увеличить объем диска :)
Я пока исчерпал свои ресурсы (раз фильтрованный индексом не получилось, то все)

Ну, мне ваших запросов не видать - хрустальный шар чего-то треснул.

Рассмотрите модификацию кластерного индекса.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Фильтрованный индекс не используется в запросе.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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