Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 План фактического выполнения разный при запуске T-SQL  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Добрый день, коллеги !
Есть интересная ситуация, один и тот же запрос
SELECT TOP (1000) "Col1011","Col1016","Expr1006","Expr1007","Expr1008",CONVERT(datetime,CONVERT(nvarchar(10),"Col1011",102),102) "Expr1009" FROM (SELECT "Tbl1005"."Дата" "Col1011","Tbl1005"."Департамент" "Col1016",SUM("Tbl1005"."Сумма") "Expr1006",SUM("Tbl1005"."СуммаУслуг") "Expr1007",SUM("Tbl1005"."Количество") "Expr1008" FROM "liv_database"."dbo"."ПродажиДляДиаграмм_View" "Tbl1005" WHERE "Tbl1005"."Счет"=N'90.01.1' AND "Tbl1005"."Департамент"<>N'Прочее' AND "Tbl1005"."Дата">=convert(datetime2(7), '2017-10-01T00:00:00') AND "Tbl1005"."Дата"<=convert(datetime2(7), '2017-10-26T20:49:22.7770000') GROUP BY "Tbl1005"."Дата","Tbl1005"."Департамент") Qry1017

Утром выполняется секунды, а к вечеру время выполнения достигает 5 минут.

Во вложении привожу утренний и вечерний фактический план.

Я не обладаю опытом решения проблем такого рода, но мне кажется, что надо каким-то образом избавиться от clustered index scan в вечернем плане выполнения, который абсолютно неадекватен и из таблицы ~100К строк на выдачу отбирает 1132, в то время как быстрый утренний план вполне себе адекватен и отдаёт практически все строки.
Картинка с другого сайта.
Прав ли я в своих предположениях и собственно что делать ?

К сообщению приложен файл (plans.zip - 10Kb) cкачать
27 окт 17, 09:40    [20905008]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
я молчу, что предикаты в плане на китайском
(привет русифицированным таблицам)
но ведь сами-то планы можно было вменяемо назвать?
какой из них хороший, а какой плохой?

К сообщению приложен файл. Размер - 5Kb
27 окт 17, 10:03    [20905105]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Yasha123
я молчу, что предикаты в плане на китайском
(привет русифицированным таблицам)
но ведь сами-то планы можно было вменяемо назвать?
какой из них хороший, а какой плохой?

100Kb вечерний 5 минутный, 90Кб утренний секундный.
27 окт 17, 10:21    [20905211]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
stavgreengo
100Kb вечерний 5 минутный, 90Кб утренний секундный.

т.е. как раз тот план, что со сканом, лучше?
у вас же наоборот написано.
---
смотрите оценки кириллической таблицы.
в плане со сканом предикат оценивается в 1729 строк,
что ближе к истине (вернет 1550 строк),
а в плане с лукапами в 1.
конечно, когда вместо 1 лукапа делается 1550, это плохо,
знал бы он про 1550, выбрал бы scan.
осталось выяснить, что у вас сбивает статистику кириллической таблицы
27 окт 17, 10:37    [20905316]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
оценив 1 строку на выходе из кириллической таблицы,
он и все дальнейшие соединения выбирает как NL,
а другой план с адекватной оценкой остальное присоединяет Merge-ем и Hash-ем.
если лень искать, что сбибает статистику,
перелейте в темповую таблицу результат выборки со всеми фильтрами
select 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#208;°&#209;&#208;°, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#161;&#209;&#402;&#208;&#188;&#208;&#188;&#208;°, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#353;&#208;&#190;&#208;»&#208;&#184;&#209;&#208;µ&#209;&#129;&#209;&#208;&#178;&#208;&#190;, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#208;&#190;&#208;&#186;&#209;&#402;&#208;&#188;&#208;µ&#208;&#189;&#209;&#208;&#161;&#209;&#209;&#208;&#190;&#208;&#186;&#208;°, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#353;&#208;&#190;&#208;&#180;SL, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#353;&#208;&#190;&#208;&#180;&#208;¦&#208;&#208;&#353;, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#208;&#184;&#208;&#180;&#208;&#382;&#209;&#208;&#180;&#208;µ&#208;»&#208;°, 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].&#208;&#163;&#209;&#129;&#208;»&#209;&#402;&#208;&#179;&#208;°
into #tmp
from [liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;] [&#208;&#191;&#208;&#180;]
where 
[liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].[&#208;&#208;°&#209;&#208;°] as [&#208;&#191;&#208;&#180;].[&#208;&#208;°&#209;&#208;°]>='2017-10-01 00:00:00.0000000' 
AND [liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].[&#208;&#208;°&#209;&#208;°] as [&#208;&#191;&#208;&#180;].[&#208;&#208;°&#209;&#208;°]<='2017-10-26 20:49:22.7770000' 
AND [liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].[&#208;&#161;&#209;&#208;µ&#209;] as [&#208;&#191;&#208;&#180;].[&#208;&#161;&#209;&#208;µ&#209;]=N'90.01.1' 
AND [liv_database].[dbo].[&#208;&#376;&#209;&#208;&#190;&#208;&#180;&#208;°&#208;&#208;&#184;&#208;&#208;»&#209;&#143;&#208;&#208;&#184;&#208;°&#208;&#179;&#209;&#208;°&#208;&#188;&#208;&#188;].[&#208;&#353;&#208;&#190;&#208;&#180;&#208;¦&#208;&#208;&#353;] as [&#208;&#191;&#208;&#180;].[&#208;&#353;&#208;&#190;&#208;&#180;&#208;¦&#208;&#208;&#353;]<>N'120400'

теперь уж он никогда не ошибется, в темповой будут все 1550 строк и это ничем не перебить
27 окт 17, 10:50    [20905381]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
wadegwadeg
Member

Откуда:
Сообщений: 36
Yasha123
осталось выяснить, что у вас сбивает статистику кириллической таблицы
Дык известно, что сбивает. Ночью у ТС, очевидно, собирается статистика, а днем при вставке новых записей проявляется давно известная проблема непрерывно возрастающих значений (в данном случае - дат), вот ее и гуглить (для 2016 - трейсфлаг 4139 и т.д. по ссылкам).
27 окт 17, 13:19    [20906296]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
wadegwadeg
Yasha123
осталось выяснить, что у вас сбивает статистику кириллической таблицы
Дык известно, что сбивает. Ночью у ТС, очевидно, собирается статистика, а днем при вставке новых записей проявляется давно известная проблема непрерывно возрастающих значений (в данном случае - дат), вот ее и гуглить (для 2016 - трейсфлаг 4139 и т.д. по ссылкам).

Забыл указать
автор
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

а описываемая проблема для фиксации флагами начиналась с 2012 и позже
27 окт 17, 13:47    [20906468]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
wadegwadeg
Ночью у ТС, очевидно, собирается статистика, а днем при вставке новых записей проявляется давно известная проблема непрерывно возрастающих значений (в данном случае - дат), вот ее и гуглить (для 2016 - трейсфлаг 4139 и т.д. по ссылкам).

так у него же 2008 R2, уж тогда 2389
Statistics on Ascending Keys

господи, щас прибежит эксперт по флагам и закричит:
вот видите, а включи он все флаги подряд, ему бы и помогло
27 окт 17, 13:53    [20906510]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
stavgreengo
Забыл указать
автор
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

а описываемая проблема для фиксации флагами начиналась с 2012 и позже

да уж цифры-то в плане, слава богу, арабские,
кириллические прописью пока не догадались использовать :)
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.50.6000.34" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
27 окт 17, 13:57    [20906538]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Yasha123
wadegwadeg
Ночью у ТС, очевидно, собирается статистика, а днем при вставке новых записей проявляется давно известная проблема непрерывно возрастающих значений (в данном случае - дат), вот ее и гуглить (для 2016 - трейсфлаг 4139 и т.д. по ссылкам).

так у него же 2008 R2, уж тогда 2389
Statistics on Ascending Keys

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

Настал вечер, а вместе с ним пришли и тормоза в запросе. Делаем ребилд индексов в нашей кириллической таблице с автоматическим пересчётом статистики, запрос начинает работать как раньше быстро. Понимаем, что Ваш совет именно, то что доктор прописал и вставляем флаги трассировки в запрос который мелкими порциями эту таблицу вечером и напичкивает до "критической массы" с строением плана выполнения. Понедельник покажет, избавились ли мы от всей этой напасти.
27 окт 17, 17:58    [20907613]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
stavgreengo
Понедельник покажет, избавились ли мы от всей этой напасти.
Замечательная практика, деплоить изменения в продакшен в пятницу вечером и уходить домой :-)
27 окт 17, 18:01    [20907623]     Ответить | Цитировать Сообщить модератору
 Re: План фактического выполнения разный при запуске T-SQL  [new]
гогол
Member [заблокирован]

Откуда:
Сообщений: 88
Может просто статистику днем обновлять?
27 окт 17, 18:56    [20907734]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить