Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
MSSQLAndDotNet
кстати, а есть какие нибудь хинты что бы сервер смотрел на статистику/индексы и при необходимости компилил план заново?
Да вроде это автоматом происходит.
15 авг 17, 14:58    [20725326]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
учить мат часть нынче не модно

https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx?f=255&MSPPError=-2147217396
15 авг 17, 15:02    [20725337]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
TaPaK
учить мат часть нынче не модно

https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx?f=255&MSPPError=-2147217396

А почему у ТСа не перестроился план?
15 авг 17, 15:21    [20725429]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MSSQLAndDotNet
TaPaK
учить мат часть нынче не модно

https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx?f=255&MSPPError=-2147217396

А почему у ТСа не перестроился план?

о,глухихслепых повезли
15 авг 17, 15:23    [20725439]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
Konst_One
Member

Откуда:
Сообщений: 11521
а зачем? сервер выбрал , что ему удобнее

MSSQLAndDotNet
TaPaK
учить мат часть нынче не модно

https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx?f=255&MSPPError=-2147217396

А почему у ТСа не перестроился план?
15 авг 17, 15:23    [20725444]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Konst_One
а зачем? сервер выбрал , что ему удобнее

MSSQLAndDotNet
пропущено...

А почему у ТСа не перестроился план?

ну ТС же написал что OPTION RECOMPILE помогло
значит план старый был
15 авг 17, 15:25    [20725458]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
а, ну так он даты параметрами отдает
у него один план на все параметры
15 авг 17, 15:27    [20725473]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
вообщем нужен индекс с инклудами, если не тяжелые и наверное без параметров правильнее
15 авг 17, 15:31    [20725499]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MSSQLAndDotNet,

и этого в управдомы
автор
ну ТС же написал что OPTION RECOMPILE помогло
значит план старый был


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


автор
ообщем нужен индекс с инклудами, если не тяжелые и наверное без параметров правильнее
15 авг 17, 15:50    [20725636]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
TaPaK
MSSQLAndDotNet,

и этого в управдомы
автор
ну ТС же написал что OPTION RECOMPILE помогло
значит план старый был


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


автор
ообщем нужен индекс с инклудами, если не тяжелые и наверное без параметров правильнее


а что не так

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

что не так?
15 авг 17, 16:35    [20725843]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
хранится
15 авг 17, 16:36    [20725846]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
TaPaK
MSSQLAndDotNet,

и этого в управдомы
автор
ну ТС же написал что OPTION RECOMPILE помогло
значит план старый был


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


автор
ообщем нужен индекс с инклудами, если не тяжелые и наверное без параметров правильнее

поясните пожалуйста что не так:

Если OPTION RECOMPILE помогло, значит план был старый.
Если оставить запрос с параметрами, как есть, то не факт что новый план будет лучше старого, как повезет.
Получается лучше прибить параметризацию

видимо статистика сильно разнится по значениям, если такая разница в производительности
другого выхода не вижу
16 авг 17, 17:08    [20728929]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MSSQLAndDotNet,
автор

поясните пожалуйста что не так:

Если OPTION RECOMPILE помогло, значит план был старый.
Если оставить запрос с параметрами, как есть, то не факт что новый план будет лучше старого, как повезет.
Получается лучше прибить параметризацию

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

узнайте что делает RECOMPILE на стейтмент без терминов страый/новый/кислый/сладкий

[тут смайлик бьётся головой об стену]
16 авг 17, 17:44    [20729054]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
TaPaK
MSSQLAndDotNet,
автор
поясните пожалуйста что не так:

Если OPTION RECOMPILE помогло, значит план был старый.
Если оставить запрос с параметрами, как есть, то не факт что новый план будет лучше старого, как повезет.
Получается лучше прибить параметризацию

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

узнайте что делает RECOMPILE на стейтмент без терминов страый/новый/кислый/сладкий

[тут смайлик бьётся головой об стену]
https://blogs.msdn.microsoft.com/robinlester/2016/08/10/improving-query-performance-with-option-recompile-constant-folding-and-avoiding-parameter-sniffing-issues/

OPTION (RECOMPILE) is a statement level command that has some very distinct advantages over WITH RECOMPILE. It does not require the whole stored procedure to be recompiled so in a large stored procedure time and CPU cycles are not spent on unnecessary compiles. It uses Constant Folding which can have generate a far superior plan.

ALTER PROCEDURE sptabdemoproc (@string varchar(150)) AS

SELECT	COUNT(*)
FROM	tabdemo1 AS A
		INNER JOIN tabdemo2 AS B ON A.ID = B.ID2
WHERE	(B.String = @string OR @string IS NULL)
OPTION	(RECOMPILE)

GO
Constant folding is a technique the optimizer uses to remove any unnecessary code to help improve performance. Constant Folding does this by removing unnecessary variables and simplifying the query before compiling the plan. In the example in the demo when the parameter comes into the plan it is either set to a string or a 'Null'. Constant Folding will remove whichever is not used. So if 'Marker' is passed in as the parameter then Constant folding will simply remove the ‘OR String IS Null’ from the predicate.
17 авг 17, 12:36    [20730860]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Dmitry V. Liseev,

давать такие выдержки из статьи это ещё большее зло чем промолчать.
17 авг 17, 12:42    [20730884]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Dmitry V. Liseev
TaPaK
MSSQLAndDotNet,
пропущено...

узнайте что делает RECOMPILE на стейтмент без терминов страый/новый/кислый/сладкий

[тут смайлик бьётся головой об стену]
https://blogs.msdn.microsoft.com/robinlester/2016/08/10/improving-query-performance-with-option-recompile-constant-folding-and-avoiding-parameter-sniffing-issues/

OPTION (RECOMPILE) is a statement level command that has some very distinct advantages over WITH RECOMPILE. It does not require the whole stored procedure to be recompiled so in a large stored procedure time and CPU cycles are not spent on unnecessary compiles. It uses Constant Folding which can have generate a far superior plan.

ALTER PROCEDURE sptabdemoproc (@string varchar(150)) AS

SELECT	COUNT(*)
FROM	tabdemo1 AS A
		INNER JOIN tabdemo2 AS B ON A.ID = B.ID2
WHERE	(B.String = @string OR @string IS NULL)
OPTION	(RECOMPILE)

GO
Constant folding is a technique the optimizer uses to remove any unnecessary code to help improve performance. Constant Folding does this by removing unnecessary variables and simplifying the query before compiling the plan. In the example in the demo when the parameter comes into the plan it is either set to a string or a 'Null'. Constant Folding will remove whichever is not used. So if 'Marker' is passed in as the parameter then Constant folding will simply remove the ‘OR String IS Null’ from the predicate.

во как, интересно, спасибо

вообщем, я так понял, OPTION (RECOMPILE) всегда лучше чем без параметров
ну и кеш планов не растет

но если это частый запрос, и з-я параметров часто повторяются, и статистика по з-ям сильно разная, то есть смысл переделать без параметров, что бы кеш планов использовался ИМХО
17 авг 17, 14:26    [20731338]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MSSQLAndDotNet,

автор
но если это частый запрос, и з-я параметров часто повторяются, и статистика по з-ям сильно разная, то есть смысл переделать без параметров, что бы кеш планов использовался ИМХО

зая в в шоке
17 авг 17, 14:30    [20731346]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
TaPaK
MSSQLAndDotNet,

автор
но если это частый запрос, и з-я параметров часто повторяются, и статистика по з-ям сильно разная, то есть смысл переделать без параметров, что бы кеш планов использовался ИМХО

зая в в шоке

а какой смысл пересобирать план если уже такой есть в кеше?
17 авг 17, 14:39    [20731383]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
TaPaK
Dmitry V. Liseev,

давать такие выдержки из статьи это ещё большее зло чем промолчать.
Я хотя бы стараюсь познать свет истины.
17 авг 17, 18:37    [20732283]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
o-o
Guest
Dmitry V. Liseev
TaPaK
Dmitry V. Liseev,

давать такие выдержки из статьи это ещё большее зло чем промолчать.
Я хотя бы стараюсь познать свет истины.

да уж, цитата совсем к месту...
Dmitry V. Liseev, где же вы увидели Constant Folding в запросе ТС?
вот еще раз его запрос:
select d.ReportDate
,d.KeyId
,d.[Principal]
,d.[Interest]
from [Daily] d 
where d.ReportDate>@ReportDate OPTION (RECOMPILE)

а вот что такое у нас Foldable Expressions
link below
SQL Server uses constant folding with the following types of expressions:

* Arithmetic expressions, such as 1+1, 5/3*2, that contain only constants.
* Logical expressions, such as 1=1 and 1>2 AND 3>4, that contain only constants.
* Built-in functions that are considered foldable by SQL Server, including CAST and CONVERT. Generally, an intrinsic function is foldable if it is a function of its inputs only and not other contextual information, such as SET options, language settings, database options, and encryption keys. Nondeterministic functions are not foldable. Deterministic built-in functions are foldable, with some exceptions.

link


----
для тех, кто не умеет читать правильные ответы по теме, еще раз отвеченное пару страниц тому назад:
invm
Невский
OPTION(RECOMPILE) помогло, а с чего вдруг сервак начал юзать не тот индекс вряд ли кто то скажет, не видя всей картины...
OPTION(RECOMPILE) заставляет сервер каждый раз строить новый план выполнения. Т.к. план строится уже при выполнении процедуры, то это дает возможность учесть значение @ReportDate и построить более оптимальный план.

А ранее план строился для неизвестного значения @ReportDate в котором, скорее всего, "юзать не тот индекс" есть Index Scan.
Потому что все необходимые столбцы можно добыть из этого индекса, а сканировать индекс дешевле чем сканировать таблицу.

нЕчего фолдерить в его запросе.
зато при рекомпиляции уже учтено значение переменной,
т.е. план строится для запроса с фильтром по известной константе
----
правда, вторая часть ответа не отражает сообщенное товарищем ТС,
ибо в индексе, используемом в плане, построенном для неизвестного значения, НЕТ всех требуемых полей:
CREATE NONCLUSTERED INDEX [idx_Daily_K2_K1_18_19] ON [dbo].[Daily]
(
[KeyId] ASC,
[ReportDate] ASC
)INCLUDE ([PastPrincipal],[PastInterest])

в этом индексе включены поля [PastPrincipal],[PastInterest].
а в запросе использованы [Principal],[Interest].
что вроде как разные поля.
поэтому если ТС действительно намерен разобраться в своей проблеме,
должен вывесить в топике хотя бы оценочный план для случая с переменной.
чтобы все смогли увидеть своими глазами, тот ли мы запрос обсуждаем,
тот ли "левый" индекс выбирается, и какие именно поля из него берутся
17 авг 17, 22:46    [20732760]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
o-o
Dmitry V. Liseev
пропущено...
Я хотя бы стараюсь познать свет истины.

да уж, цитата совсем к месту...
Dmitry V. Liseev, где же вы увидели Constant Folding в запросе ТС?
От коллеги было предложение почитать, что делает OPTION (RECOMPILE) на стейтмент. Собственно, я на него и отвечал, указав, что есть некоторые эффекты от OPTION (RECOMPILE) на стейтмент. И привёл тынц на статью, которая называется
Improving query performance with OPTION (RECOMPILE), Constant Folding and avoiding Parameter Sniffing issues.
В ней и про Constant Folding и про OPTIMIZE FOR и про WITH RECOMPILE на процедуру. С примерами кода и планами. Статью нужно просто прочитать целиком. В задаче топик стартера нет Constant Folding, что не отменяет ценности других частей статьи.
18 авг 17, 08:24    [20733027]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Dmitry V. Liseev
o-o
пропущено...

да уж, цитата совсем к месту...
Dmitry V. Liseev, где же вы увидели Constant Folding в запросе ТС?
От коллеги было предложение почитать, что делает OPTION (RECOMPILE) на стейтмент. Собственно, я на него и отвечал, указав, что есть некоторые эффекты от OPTION (RECOMPILE) на стейтмент. И привёл тынц на статью, которая называется
Improving query performance with OPTION (RECOMPILE), Constant Folding and avoiding Parameter Sniffing issues.
В ней и про Constant Folding и про OPTIMIZE FOR и про WITH RECOMPILE на процедуру. С примерами кода и планами. Статью нужно просто прочитать целиком. В задаче топик стартера нет Constant Folding, что не отменяет ценности других частей статьи.

ну расскажите нам тогда где же тут Parameter Sniffing?
18 авг 17, 08:57    [20733117]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
коллеги интересно узнать когда выгоднее писать OPTION RECOMPILE, а когда делать запрос без параметров?
18 авг 17, 09:15    [20733185]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MSSQLAndDotNet
а когда делать запрос без параметров?

что же это такое?
18 авг 17, 09:16    [20733191]     Ответить | Цитировать Сообщить модератору
 Re: Жутко тупит запрос, при использовании в where переменной  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
TaPaK
MSSQLAndDotNet
а когда делать запрос без параметров?

что же это такое?


План будет закеширован по тексту: SELECT * FROM tb1 WHERE date = @date_par
Возможны проблемы, если статистика сильно разная, для разных дат могут быть сильно разные планы.
DECLARE @date_pap DATETIME = '2017-08-18 09:24'
SELECT * FROM tb1 WHERE date = @date_par

План будет закеширован по тексту: SELECT * FROM tb1 WHERE date = '2017-08-18 09:24'
Возможны проблемы с размером кеша планов.
SELECT * FROM tb1 WHERE date = '2017-08-18 09:24'
18 авг 17, 09:28    [20733222]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить