powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгое выполнение запроса
13 сообщений из 13, страница 1 из 1
Долгое выполнение запроса
    #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
Долгое выполнение запроса
    #39832315
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Долгое выполнение запроса
    #39832318
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может сеть, вы же возвращаете select?
...
Рейтинг: 0 / 0
Долгое выполнение запроса
    #39832363
У вас очевидные проблемы из-за прослушивания параметров + план никогда не будет параллельным потому что скалярные функции используются. План покажите в момент когда запрос медленный + какой размер таблицы?
...
Рейтинг: 0 / 0
Долгое выполнение запроса
    #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
Долгое выполнение запроса
    #39832373
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Syrovatchenko,

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

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

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

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

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


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