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

Откуда:
Сообщений: 5
В таком виде, с передачей параметра процедура выполняется быстро и корректно.

CREATE PROCEDURE dbo.patReport(@start datetime)
AS
  SELECT
    CONVERT(VARCHAR(10), st.reg_date_time, 126) AS 'activationDate'
   ,st.card_number AS 'UID'
   ,st.validator_id AS 'SAM'
   ,st.sum_payment / 100 AS 'paymentInRubles'
  FROM [SQL-LGT].Arhiv_SOD.dbo.SodTrans st
  WHERE st.reg_date_time BETWEEN @start AND DATEADD(SECOND, 60 * 60 * 24 - 1, @start) -- 
  AND st.dos_flag = 1
  AND st.validator_id IN (SELECT
      CONFIG_NAME
    FROM baseSOD.dbo.AV2SAMEmission [as]
    WHERE CLIENT_NAME = 'ALEX')
GO


Но если убрать параметр и добавить в процедуру вычисление начала вчерашнего дня, то процедура выполняется бесконечно долго.


CREATE PROCEDURE dbo.patReport
AS
  DECLARE @start DATETIME
  SET @start = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1);
  SELECT
    CONVERT(VARCHAR(10), st.reg_date_time, 126) AS 'activationDate'
   ,st.card_number AS 'UID'
   ,st.validator_id AS 'SAM'
   ,st.sum_payment / 100 AS 'paymentInRubles'
  FROM [SQL-LGT].Arhiv_SOD.dbo.SodTrans st
  WHERE st.reg_date_time BETWEEN @start AND DATEADD(SECOND, 60 * 60 * 24 - 1, @start) -- 
  AND st.dos_flag = 1
  AND st.validator_id IN (SELECT
      CONFIG_NAME
    FROM baseSOD.dbo.AV2SAMEmission [as]
    WHERE CLIENT_NAME = 'ALEX')
GO

В чем может быть причина?
Спасибо!
16 янв 19, 17:36    [21787102]     Ответить | Цитировать Сообщить модератору
 Re: тормозит запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
PacManStar,

Читайте про parameters sniffing

Для лечения можете использовать option(recompile)
Или поставить костыль вида:
CREATE PROCEDURE dbo.patReport
 @start DATETIME = какая-то дата
AS
  SET @start = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1);
  SELECT
    CONVERT(VARCHAR(10), st.reg_date_time, 126) AS 'activationDate'
   ,st.card_number AS 'UID'
   ,st.validator_id AS 'SAM'
   ,st.sum_payment / 100 AS 'paymentInRubles'
  FROM [SQL-LGT].Arhiv_SOD.dbo.SodTrans st
  WHERE st.reg_date_time BETWEEN @start AND DATEADD(SECOND, 60 * 60 * 24 - 1, @start) -- 
  AND st.dos_flag = 1
  AND st.validator_id IN (SELECT
      CONFIG_NAME
    FROM baseSOD.dbo.AV2SAMEmission [as]
    WHERE CLIENT_NAME = 'ALEX')
16 янв 19, 17:52    [21787127]     Ответить | Цитировать Сообщить модератору
 Re: тормозит запрос  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Попробуйте вот так:
CREATE PROCEDURE dbo.patReport
AS
  SELECT
    CONVERT(VARCHAR(10), st.reg_date_time, 126) AS 'activationDate'
   ,st.card_number AS 'UID'
   ,st.validator_id AS 'SAM'
   ,st.sum_payment / 100 AS 'paymentInRubles'
  FROM [SQL-LGT].Arhiv_SOD.dbo.SodTrans st
  WHERE st.reg_date_time BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1) AND DATEADD(SECOND, 60 * 60 * 24 - 1, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1)) -- 
  AND st.dos_flag = 1
  AND st.validator_id IN (SELECT
      CONFIG_NAME
    FROM baseSOD.dbo.AV2SAMEmission [as]
    WHERE CLIENT_NAME = 'ALEX')
GO
17 янв 19, 02:37    [21787413]     Ответить | Цитировать Сообщить модератору
 Re: тормозит запрос  [new]
PacManStar
Member

Откуда:
Сообщений: 5
Mind,
Благодарю! То что надо.
17 янв 19, 11:56    [21787666]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить