Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Долгая процедура  [new]
Звег
Guest
Есть запрос который выводит 10к записей за 20 секунд. Как только вставляю этот запрос в процедуру и вызываю ее то процедура 20 минут молчит, а потом еще в течении 15 минут выдает 2800 записей ну и так далее в час по чайной ложке. В чем может быть причина ?
25 май 11, 12:21    [10705518]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
а
Guest
Звег,
запрос в студию!
25 май 11, 12:22    [10705533]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Звег,

Неудачный план из-за "прослушивания параметров"(поиск)?
25 май 11, 12:24    [10705555]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
Звег
Guest
declare @datefrom datetime
declare @dateto datetime
BEGIN
SET @DATEFROM = dbo.svf_get_first_day_month_before (GETDATE())
SET @DATETO = dbo.svf_get_last_day_month_before (GETDATE())

END

SELECT 1 AS GROUP_ID
,S.SER_ID --ID ОБРАЩЕНИЯ
,DATEDIFF(mm,CASE WHEN (SDM.delivereddate IS NULL AND S2.REG_CREATED IS not NULL) THEN S2.REG_CREATED
WHEN (S2.REG_CREATED IS NULL AND SDM.delivereddate IS not NULL) THEN SDM.delivereddate
WHEN (S2.REG_CREATED IS NULL AND SDM.delivereddate IS NULL) THEN S.REG_CREATED
END,S.REG_CREATED) AS REG_TIME

FROM dbo.ITSM_SERVICECALLS S with (nolock)
LEFT JOIN dbo.ITSM_SER_CUSTOM_FIELDS CF with (nolock)
ON S.SER_OID=CF.SCF_SER_OID
LEFT JOIN dbo.ITSM_SERVICECALLS S2 with (nolock)
ON CF.SCF_SCNUMBER1=S2.SER_ID
AND S2.REG_CREATED < S.REG_CREATED
LEFT JOIN [dbo].[(MOT@domodedovo.ru)_(Memo)] SDM with (nolock)
ON substring(CF.SCF_SCTEXT1,patindex('%?OpenDocument%',CF.SCF_SCTEXT1)-32,32)= SDM.universalid
AND SDM.delivereddate < S.REG_CREATED
-- поле CF.SCF_SCTEXT1 содержит ссылку на письмо в почтовом ящике SD,
-- 32 символа до строки "?OpenDocument" - UNID письма.
WHERE S.ser_med_oid = 3094610042
AND S.REG_CREATED BETWEEN @DATEFROM AND @DATETO

посмотрел план - отличия есть но в любом случае 35 проентов уходит на выборку по кластеризованному индексу выделенного жирным условия. это запрос, процедура отличается только тем что в начала я передаю в нее в качестве параметров NULL и в теле присваиваю им значения функйи по условию (курсив)
25 май 11, 12:31    [10705641]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
Звег
Guest
Прочитал https://www.sql.ru/articles/mssql/2005/070704TechniqueForEnsuringPlanStabilityInSQLServer2000.shtml
в итоге сдела дополнительно пересвоение значений параметров внутри процедуры.Но все арвно не совсем понимаю:
сначала я передал в качестве параметров две даты, и вызвал процедуру. Она отработала быстро. Затем я передал в качестве паарметров NULL но в теле процедуры есть услови что если оба параметра НУЛЛ то присваиваю им значение (те же самые что передавал в начале). В итоге как я понял план создался по первому запуску, но почему он так долго работал с учетом того что во второй раз парамтры пряняли так или яначе теже самые значения ?
25 май 11, 13:05    [10705985]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
а
Guest
Звег,
покажи уж и процедуру
25 май 11, 13:37    [10706323]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
Звег
Guest
ALTER PROCEDURE [sd].[AvgMailRegTime]
(
@datefrom datetime,
@dateto datetime
)
AS
BEGIN
SET NOCOUNT ON
declare @datefrom1 datetime
declare @dateto1 datetime

IF (@DATEFROM IS NULL AND @DATETO IS NOT NULL) --Если не введена дата начала отчетного периода
SET @DATEFROM = '1993-01-01 00:00:00.000' --берется год основания истлайна;
IF (@DATEFROM IS NOT NULL AND @DATETO IS NULL) --Если не введена дата оконцания отчтеного периода
SET @DATEFROM = GETDATE() --берется текущая дата;
IF (@DATEFROM IS NULL AND @DATETO IS NULL) --Если не введены никакие рамки отчетного периода то...

BEGIN
SET @DATEFROM = dbo.svf_get_first_day_month_before (GETDATE()) --...берется предыдущий месяц;
SET @DATETO = dbo.svf_get_last_day_month_before (GETDATE())
set @DATEFROM1 = @DATEFROM
set @DATETO1 = @DATETO

END

SELECT 1 AS GROUP_ID --Для групировки в кристале
,S.SER_ID --ID ОБРАЩЕНИЯ
-- ,S.SER_OID --OID ОБРАЩЕНИЯ (Для отладки)
-- ,S.REG_CREATED --ДАТА РЕГИСТРАЦИИ ОБРАЩЕНИЯ (Для отладки)
-- ,S2.REG_CREATED --ДАТА РЕГИСТРАЦИИ ПРЕДШЕСТВУЮЩЕГО ОБРАЩЕНИЯ (Для отладки)
-- ,substring(CF.SCF_SCTEXT1,patindex('%?OpenDocument%',CF.SCF_SCTEXT1)-32,32) --(Для отладки)
-- ,SDM.delivereddate as LET_REG --ДАТА РЕГИСТРАЦИИ ПРЕДШЕСТВУЮЩЕГО ПИСЬМА (Для отладки)
,DATEDIFF(mm,CASE WHEN (SDM.delivereddate IS NULL AND S2.REG_CREATED IS not NULL) THEN S2.REG_CREATED
WHEN (S2.REG_CREATED IS NULL AND SDM.delivereddate IS not NULL) THEN SDM.delivereddate
WHEN (S2.REG_CREATED IS NULL AND SDM.delivereddate IS NULL) THEN S.REG_CREATED
END,S.REG_CREATED) AS REG_TIME

FROM dbo.ITSM_SERVICECALLS S with (nolock)
LEFT JOIN dbo.ITSM_SER_CUSTOM_FIELDS CF with (nolock) -------для получения даты регистрации взаимосвязанного обращения
ON S.SER_OID=CF.SCF_SER_OID ------/CF.SCF_SCNUMBER1 - ID обращения, S2.REG_CREATED - дата его регистрации
LEFT JOIN dbo.ITSM_SERVICECALLS S2 with (nolock) -----/
ON CF.SCF_SCNUMBER1=S2.SER_ID ----/
AND S2.REG_CREATED < S.REG_CREATED
LEFT JOIN [dbo].[(MOT@domodedovo.ru)_(Memo)] SDM with (nolock)
ON substring(CF.SCF_SCTEXT1,patindex('%?OpenDocument%',CF.SCF_SCTEXT1)-32,32)= SDM.universalid
AND SDM.delivereddate < S.REG_CREATED
-- поле CF.SCF_SCTEXT1 содержит ссылку на письмо в почтовом ящике SD,
-- 32 символа до строки "?OpenDocument" - UNID письма.
WHERE S.ser_med_oid = 3094610042 --Обращение зарегистрировано по электронной почте
AND S.REG_CREATED BETWEEN @DATEFROM1 AND @DATETO1

END

Выделенное жирным добавил и все сразу стало нормально, хотя по факту что при первом запуске с датами что при запуске с нулевыми значениями паарметры принимали одно и тоже значение.
25 май 11, 14:29    [10706842]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Вы не жирным выделяйте, а тегом src пользуйтесь.
25 май 11, 14:35    [10706890]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
ошибочка
Guest
Звег, ошибочка

IF (@DATEFROM IS NOT NULL AND @DATETO IS NULL) --Если не введена дата оконцания отчтеного периода
SET @DATEFROM = GETDATE() --берется текущая дата;

IF (@DATEFROM IS NOT NULL AND @DATETO IS NULL) --Если не введена дата оконцания отчтеного периода
SET @DATETO = GETDATE() --берется текущая дата;
25 май 11, 14:42    [10706941]     Ответить | Цитировать Сообщить модератору
 Re: Долгая процедура  [new]
Звег
Guest
Ну так или иначе с таким условием я его не запускал так что это не влияет
25 май 11, 14:47    [10706980]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить