|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
Всем привет. Столкнулся с данным ограничением на одном из своих серверов, вот каков результат следующих запросов: Код: sql 1. 2. 3. 4. 5. 6. 7.
Вероятно для запроса подобного типа: авторSELECT [dbo].[fn_GetClosingGladeByGoodsGroup](4,'22.06.2021 10:00:27',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](2,'22.06.2021 12:00:26',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](6,'22.06.2021 13:00:36',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](5,'21.06.2021 18:00:09',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](3,'22.06.2021 13:00:27',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](1,'22.06.2021 13:00:34',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](1,'22.06.2021 16:00:09',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](4,'22.06.2021 13:30:11',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](6,'22.06.2021 13:00:41',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](3,'22.06.2021 13:00:28',15) каждый раз создается новый план. Можно ли как то оптимизировать со стороны сервера эту особенность? Версия сервера Microsoft SQL Server 2019 (RTM-CU4) (KB4548597) - 15.0.4033.1 (X64) Mar 14 2020 16:10:35 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor) Размер оперативки 128гб. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 16:19 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
Эээ... Форсированную параметризацию включить? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 16:26 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
uaggster Эээ... Форсированную параметризацию включить? Так просто, и больше даже ничего анализировать не нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 16:37 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 17:29 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, сравните запросы, чем они отличаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 18:09 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa uaggster Эээ... Форсированную параметризацию включить? Так просто, и больше даже ничего анализировать не нужно? Разумеется нужно :-) Поведение системы после, например :-))) Но количество планов в кэше радикально уменьшится. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 08:27 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
Не совсем понял из мануалов, как работает параметризация, планов в кэше действительно стало меньше, может просто нужно больше времени, что-бы кэш заполнился. Включил forced parameterization на самую активную бд, сбросил кэш на сервере, но судя по содержимому кэша, результат не тот, какого я ждал, при вожу пример того же запроса: ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 09:36 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
Я ожидал, что для всего пула этого запроса с разными параметрами сформируется один план. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 09:38 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, Вернулись в исходное положение: ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 11:33 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa авторSELECT [dbo].[fn_GetClosingGladeByGoodsGroup](4,'22.06.2021 10:00:27',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](2,'22.06.2021 12:00:26',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](6,'22.06.2021 13:00:36',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](5,'21.06.2021 18:00:09',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](3,'22.06.2021 13:00:27',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](1,'22.06.2021 13:00:34',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](1,'22.06.2021 16:00:09',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](4,'22.06.2021 13:30:11',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](6,'22.06.2021 13:00:41',15) SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](3,'22.06.2021 13:00:28',15) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 11:55 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, принудительная параметризация поможет, если запросы отличаются только знfчениями констант в выражении where. Поэтому надо определить - чем отличаются запросы. Например, select a from b where c = 1 (1 план) select a from b where c = 2 (2 план) select a from b where c = 3 (3 план) можно привести к одному сохранённому плану. Если имеется в виду выполнение скалярной функции вида SELECT [dbo].[fn_GetClosingGladeByGoodsGroup](4,'22.06.2021 10:00:27',15), то привести это выражение к единому плану нельзя. Параметры необходимо задать переменными. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 11:58 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
invm teCa пропущено... А есть способы увеличить этот придел? Как я понимаю, он пропорционален размеру памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 12:07 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, у вас ситуация, когда нет ограничений на рост, как я понимаю, то есть разнообразие запросов бесконечно. Можно попробовать включить оптимизацию для AD-HOC. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 12:18 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, у вас при включенной серверной опции optimize for ad-hoc workloads каждый первый запуск такой инструкции будет создавать plan-stub, но если на сервер прилетит запрос с таким же текстом, то plan-stub уже сформируется в полноценный CachedPlan если у вас включена принудительная параметеризация на базе, по сути для каждой инструкции у вас план будет параметеризован, то есть результирующий план будет использован параметеризованный. к приеру запустите в ssms отдельно два запроса: Код: sql 1. 2. 3. 4. 5. 6. 7.
и посмотрите на query_plan_hash, он будет одинаковым для обоих запросов. если по этому query_plan_hash вы полезите в представление sys.dm_exec_query_stats то в случае parameterization simple вы увидите две записи где plan_handle будет соотвествовать отдельному CompliedPlan, а в случае forced parameterization ссылка будет на план использующий параметры но это не отменяет самого факта что на каждый ad-hoc запрос у вас будет сформирован план, его соджержимое будет единичный оператор select в таком случае ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 12:22 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
Владислав Колосов, В том то и дело, судя по тому, что в функцию передается параметр время "22.06.2021 10:00:27", то и для каждого запроса с отличным временем от предыдущего будет создаваться новый план. Видимо в перспективе, любой лимит будет так же заполнен. Было бы логично предположить, что в таком случае, план используется только 1 раз и хранить мне его вообще нет смысла? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 12:23 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, для каждого набора параметров сервер формирует отдельный план. Да, хранить нет смысла, попробуйте поработать с включенной AD-hoc оптимизацией. Но это может оказать влияние на прочие запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 12:27 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
Собрал побольше информации о этом типе запросов. Для всех планов этого запроса дата_создания = дата_последнего_выполнения = дата_компиляции, те, план действительно применяется 1 раз, а дальше остается висеть баластом. Могу ли я вручную удалять эти планы? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 12:57 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, можете, получите их plan_handle и вызывайте dbcc freeproccache (<plan_handle>); ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 13:29 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
felix_ff teCa, можете, получите их plan_handle и вызывайте dbcc freeproccache (<plan_handle>); Написал вот такой запрос, который формирует список команд для удаления плана: Код: sql 1. 2. 3.
Подскажите, есть ли возможность сохранить результат в текст и выполнить одним разом, без использования курсоров. Полагаю, что курсором выйдет крайне медленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 14:58 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, формируйте строку скрипта единым пакетом, что бы у вас получалась команда Код: sql 1. 2. 3.
примеров как получить агрегацию строки полно. STRING_AGG, for xml path, select @var+=, GroupConcat(CLR) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 15:17 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
felix_ff, Спасибо, все получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 15:30 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa, Опять немного запутался. Хочу понять, как можно выявить "одноразовые планы", как я понимаю, отправная точка в поисках это sys.dm_exec_query_stats вот таким запросом, я получаю запросы, для которых скомпилировано боле чем один план: Код: sql 1. 2. 3.
Это будет правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 16:06 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa Это будет правильно? нет, смотрите sys.dm_exec_cached_plans (usecounts, refcounts) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 16:31 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
teCa Это будет правильно? В sys.dm_exec_query_stats есть столбец execution_count. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 16:31 |
|
Поясните про ограничение сервера в 160036 планов запросов?
|
|||
---|---|---|---|
#18+
komrad teCa Это будет правильно? нет, смотрите sys.dm_exec_cached_plans (usecounts, refcounts) Получается, что кандидаты на удаление планы usecounts=1? Код: sql 1. 2. 3. 4. 5.
конечно грубое решение, тк в этот список могут попадать валидные планы, которые редко используются, но из 160т вычистилось 120т. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 16:54 |
|
|
start [/forum/topic.php?fid=46&fpage=21&tid=1684558]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 417ms |
0 / 0 |