Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тормозит запрос / 4 сообщений из 4, страница 1 из 1
16.01.2019, 17:36
    #39760452
PacManStar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тормозит запрос
В таком виде, с передачей параметра процедура выполняется быстро и корректно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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



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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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


В чем может быть причина?
Спасибо!
...
Рейтинг: 0 / 0
16.01.2019, 17:52
    #39760461
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тормозит запрос
PacManStar,

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

Для лечения можете использовать option(recompile)
Или поставить костыль вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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')
...
Рейтинг: 0 / 0
17.01.2019, 02:37
    #39760590
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тормозит запрос
Попробуйте вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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
...
Рейтинг: 0 / 0
17.01.2019, 11:56
    #39760737
PacManStar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тормозит запрос
Mind,
Благодарю! То что надо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тормозит запрос / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]