Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгое выполнение запроса / 13 сообщений из 13, страница 1 из 1
01.07.2019, 14:45
    #39832311
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Здравствуйте!

MS SQL SERVER 2017.
Хранимая процедура в студии выполняется мгновенно а с клиента посредством компонентов ADO в разы дольше.

Имеется таблица вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE [dbo].[FaceActivity](
	[FaceActivityID] [int] IDENTITY(1,1) NOT NULL,
	[FaceMainGUID] [uniqueidentifier] NOT NULL,
	[ActualS] [date] NULL,
	[ActualPo] [date] NULL,
	[Post] [varchar](250) NULL,
	[OrgTreeID] [int] NULL,
	[OrgDicTypeLinkID] [int] NULL,
	[BasisInfoID] [int] NULL,
 CONSTRAINT [PK_FaceActivity] PRIMARY KEY CLUSTERED 
(
	[FaceActivityID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [IX_FaceActivity_FaceMainGUID_OrgTreeID] ON [dbo].[FaceActivity]
(
	[FaceMainGUID] ASC,
	[OrgTreeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_FaceActivity_OrgTreeID_FaceMainGUID] ON [dbo].[FaceActivity]
(
	[OrgTreeID] ASC,
	[FaceMainGUID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
END


Хранимая процедура
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
ALTER PROCEDURE [tblRead].[sp_FaceActivity] 
	@FaceMainGUID		UNIQUEIDENTIFIER = NULL
	,@FaceActivityID	INT = NULL
AS
BEGIN
	SET NOCOUNT ON;

	SELECT [FaceActivityID]
		  ,[FaceMainGUID]
		  ,[ActualS] = CAST([ActualS] AS DATETIME)
		  ,[ActualPo] = CAST([ActualPo] AS DATETIME)
		  ,[Post]
		  ,[OrgTreeID]
		  ,fa.OrgDicTypeLinkID
		  ,OrgNam = org.ssf_OrgName([OrgTreeID], 1, ', ')
		  ,BasisInfoID
		  ,BasisInfo = dbo.ssf_BasisInfo(fa.BasisInfoID)
	  FROM [dbo].[FaceActivity] fa
	  WHERE --fa.FaceMainGUID = @FaceMainGUID если оставить таким образом условие а ниже удалить тоже быстро выполняется
		(fa.FaceMainGUID = @FaceMainGUID OR @FaceMainGUID IS NULL)
		AND (fa.FaceActivityID = @FaceActivityID	OR @FaceActivityID IS NULL)
		AND (@FaceMainGUID IS NOT NULL OR @FaceActivityID IS NOT NULL)



С клиента идет запрос
Код: sql
1.
2.
exec sp_executesql N'exec [tblRead].[sp_FaceActivity] @P1
',N'@P1 varchar(39)','{18CA254E-395C-4840-88F5-21DA9AFCF539}'



Выполняется долго от 10 до 15 сек. профайлере.
И тот же запрос в студии менее секунды.
Кэш планов чистил не помогает.
Экспериментальным путем выяснил следующее если на таблице удалить индексы, то запрос выполняется за 1 сек. Но тогда проблемы возникают в других запросах там где индекс необходим. Делал процедуру в виде динамического запроса тогда время выполнения менее 1 сек., но тогда проблемы с предоставлением прав.
И такая проблема на всех подобных табл и процедурах.
На данный момент как решение приходится в процедуре делать условие в зависимости от аргументов делать запросы с различным разделом where
Уважаемые знатоки MS SQL SERVER, почему компактное решение быстро выполняется в студии и так долго с клиентского приложения???
...
Рейтинг: 0 / 0
01.07.2019, 14:48
    #39832315
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
...
Рейтинг: 0 / 0
01.07.2019, 14:50
    #39832318
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Может сеть, вы же возвращаете select?
...
Рейтинг: 0 / 0
01.07.2019, 15:46
    #39832363
Долгое выполнение запроса
У вас очевидные проблемы из-за прослушивания параметров + план никогда не будет параллельным потому что скалярные функции используются. План покажите в момент когда запрос медленный + какой размер таблицы?
...
Рейтинг: 0 / 0
01.07.2019, 15:54
    #39832371
Долгое выполнение запроса
Можно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
ALTER PROCEDURE [tblRead].[sp_FaceActivity]
(
      @FaceMainGUID UNIQUEIDENTIFIER = NULL
    , @FaceActivityID INT = NULL
)
AS BEGIN

    SET NOCOUNT ON

    IF @FaceMainGUID IS NOT NULL AND @FaceActivityID IS NOT NULL
        SELECT FaceActivityID
             , FaceMainGUID
             , ActualS = CAST(ActualS AS DATETIME)
             , ActualPo = CAST(ActualPo AS DATETIME)
             , Post
             , OrgTreeID
             , OrgDicTypeLinkID
             , OrgNam = org.ssf_OrgName(OrgTreeID, 1, ', ')
             , BasisInfoID
             , BasisInfo = dbo.ssf_BasisInfo(BasisInfoID)
        FROM dbo.FaceActivity
        WHERE FaceActivityID = @FaceActivityID
            AND FaceMainGUID = @FaceMainGUID
    ELSE IF @FaceMainGUID IS NULL AND @FaceActivityID IS NOT NULL
        SELECT FaceActivityID
             , FaceMainGUID
             , ActualS = CAST(ActualS AS DATETIME)
             , ActualPo = CAST(ActualPo AS DATETIME)
             , Post
             , OrgTreeID
             , OrgDicTypeLinkID
             , OrgNam = org.ssf_OrgName(OrgTreeID, 1, ', ')
             , BasisInfoID
             , BasisInfo = dbo.ssf_BasisInfo(BasisInfoID)
        FROM dbo.FaceActivity
        WHERE FaceActivityID = @FaceActivityID
    ELSE IF @FaceMainGUID IS NOT NULL AND @FaceActivityID IS NULL
        SELECT FaceActivityID
             , FaceMainGUID
             , ActualS = CAST(ActualS AS DATETIME)
             , ActualPo = CAST(ActualPo AS DATETIME)
             , Post
             , OrgTreeID
             , OrgDicTypeLinkID
             , OrgNam = org.ssf_OrgName(OrgTreeID, 1, ', ')
             , BasisInfoID
             , BasisInfo = dbo.ssf_BasisInfo(BasisInfoID)
        FROM dbo.FaceActivity
        WHERE FaceMainGUID = @FaceMainGUID

END


Можно через OPTION(RECOMPILE):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
ALTER PROCEDURE [tblRead].[sp_FaceActivity]
(
      @FaceMainGUID UNIQUEIDENTIFIER = NULL
    , @FaceActivityID INT = NULL
)
AS BEGIN

    SET NOCOUNT ON

    SELECT FaceActivityID
         , FaceMainGUID
         , ActualS = CAST(ActualS AS DATETIME)
         , ActualPo = CAST(ActualPo AS DATETIME)
         , Post
         , OrgTreeID
         , OrgDicTypeLinkID
         , OrgNam = org.ssf_OrgName(OrgTreeID, 1, ', ')
         , BasisInfoID
         , BasisInfo = dbo.ssf_BasisInfo(BasisInfoID)
    FROM dbo.FaceActivity
    WHERE (FaceActivityID = @FaceActivityID OR @FaceActivityID IS NULL)
        AND (FaceMainGUID = @FaceMainGUID OR @FaceMainGUID IS NULL)
    OPTION(RECOMPILE)

END
...
Рейтинг: 0 / 0
01.07.2019, 15:57
    #39832373
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Sergey Syrovatchenko,

а отчего там первый вариант спасает? Разве что переназначить переменные, а так может ничего не изменить
...
Рейтинг: 0 / 0
01.07.2019, 16:04
    #39832377
Долгое выполнение запроса
TaPaKотчего там первый вариант спасает?
Формально не спасет. На план смотреть надо, которого у нас увы нет. Мое подозрение что из-за скалярок план последовательный + неверный индекс выбирается с фулл сканом.
...
Рейтинг: 0 / 0
01.07.2019, 16:07
    #39832378
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Sergey SyrovatchenkoTaPaKотчего там первый вариант спасает?
Формально не спасет. На план смотреть надо, которого у нас увы нет. Мое подозрение что из-за скалярок план последовательный + неверный индекс выбирается с фулл сканом.
а в "студии" будет параллельный что ли?

а так да, если прото то recompile
...
Рейтинг: 0 / 0
01.07.2019, 16:10
    #39832382
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Sergey SyrovatchenkoTaPaKотчего там первый вариант спасает?
Формально не спасет. На план смотреть надо, которого у нас увы нет. Мое подозрение что из-за скалярок план последовательный + неверный индекс выбирается с фулл сканом.
ну и прослушивание не даст "не верный индекс", а тот который скомпилирован и тут больше вопросы к ошибке ввыбора соединений
...
Рейтинг: 0 / 0
01.07.2019, 16:15
    #39832386
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Такой тривиальный запрос, как у тредстартера, лечится выставлением одинаковых опций подключения

см.
DBCC USER_OPTIONS.
...
Рейтинг: 0 / 0
01.07.2019, 16:17
    #39832387
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
aleks222Такой тривиальный запрос, как у тредстартера, лечится выставлением одинаковых опций подключения

см.
DBCC USER_OPTIONS.
тривиальный бред
...
Рейтинг: 0 / 0
01.07.2019, 16:34
    #39832396
Megabyte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
aleks222Такой тривиальный запрос, как у тредстартера, лечится выставлением одинаковых опций подключения

см.
DBCC USER_OPTIONS.
Это справедливо только для конкретных случаев, в общем случае - нет.
...
Рейтинг: 0 / 0
01.07.2019, 18:52
    #39832456
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение запроса
Что там можно обсуждать, во втором сообщении есть ответ.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгое выполнение запроса / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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