powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возникает ошибка 8622
12 сообщений из 12, страница 1 из 1
Возникает ошибка 8622
    #40002686
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять причину, есть простой запрос

Код: sql
1.
SELECT column1 FROM table1 with (readuncommitted, index(index1)) WHERE column1 = value1



он выполняется без проблем, но когда я оборачиваю этот запрос в хранимую процедуру

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE procedure1   
    @value1 nvarchar(50)   
AS   

    SET NOCOUNT ON;  
    SELECT column1 FROM table1 with (readuncommitted, index(index1)) WHERE column1 = @value1
GO  


получаю ошибку
Msg 8622 Level 16 State 1 Line 1, Query processor could not produce a query plan because of the hints defined in this query.

Подскажите чем 2 эти инструкции принципиально отличаются для сервера?
Если убираю , index(index1) то работает запрос, но почему-то сервер не использует индекс по column1.
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002688
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

обновление статистики решает проблему?
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002689
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

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

Не решает
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002691
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Да, фильтрованный
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002695
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

а критерий фильтрации у вас по column1 или по другому полю?
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002699
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик,

Да, по нему
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002703
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452
Да, фильтрованный
Код: sql
1.
SELECT column1 FROM table1 with (readuncommitted, index(index1)) WHERE column1 = @value1 option (recompile)
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002704
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

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

то есть если вы к примеру определили его так:

Код: sql
1.
create index ix on [dbo].[table] where [column1] < 100; 



то в процедуре вы должны написать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE procedure1   
    @value1 nvarchar(50)   
AS   

    SET NOCOUNT ON;  
    SELECT column1 FROM table1 with (readuncommitted, index(index1)) WHERE [column1] < 100 and column1 = @value1
GO  



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

Я попробую так. Но почему запрос отдельно работает, и не работает внутри процедуры?
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002709
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

у вас в процедуре используется параметр @value

для оптимизатора на момент компиляции его значение не известно. (хотя вообще теоретически на первую компиляцию он его должен прослушивать по parameter-sniffing)

то есть у вас может получится что в первый раз вы запустите процедуру с параметром @value = 10 а в другой раз с @value = 500

из-за этого проиходит коллизия для предиката фильтра индекса. в первом случае значение удовлетворяет предикату и все хорошо индекс может быть использован. а во втором случае значение больше чем значение предиката индекса и такой индекс уже никак использовать нельзя (в нем просто нет таких строк).

вам invm написал как это обойти, добавить к инструкции select подсказку option (recompile) что бы у вас инструкция внутри хранимки всегда компилировалась с актуальным значением, но вас это не избавит от ошибки если вы передадите в процедуру значение которое не будет удовлетворять предикату фильтрации индекса.
...
Рейтинг: 0 / 0
Возникает ошибка 8622
    #40002772
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

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


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