3
我有一個遞歸CTE,可以計算組織中的經理層次結構。與沒有存儲過程的CTE相比,爲什麼存儲過程中的CTE需要很長時間?
這下面查詢需要< 2秒至完成
WITH OrganisationChart ([Identity], [DisplayName], Title, [Level], Manager) AS
(
SELECT
[Identity], [DisplayName], Title, 0, Manager
FROM
[data].[DailyUserV1]
WHERE
[Identity] = '7276DB4F-33B0-4074-9903-D95D740A8BF3' AND Date = '2015-08-03'
UNION ALL
SELECT
emp.[Identity],
emp.[DisplayName],
emp.Title,
[Level] + 1,
emp.Manager
FROM
[data].[DailyUserV1] emp
INNER JOIN
OrganisationChart ON emp.Manager = OrganisationChart.[Identity]
WHERE
Date = '2015-08-03'
)
SELECT * FROM OrganisationChart
雖然纏繞在存儲過程中該相同的查詢需要> 15分鐘,然後超時!
IF (OBJECT_ID('[dbo].[GetOrganizationChart]') IS NOT NULL)
DROP PROCEDURE [dbo].[GetOrganizationChart]
GO
CREATE PROCEDURE [dbo].[GetOrganizationChart]
@identity varchar(256),
@date datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @userId varchar(256);
SET @userId = @identity;
DECLARE @endDate datetime;
SET @endDate = @date;
WITH OrganisationChart ([Identity], [DisplayName], Title, [Level], Manager) AS
(
SELECT
[Identity], [DisplayName], Title, 0, Manager
FROM
[data].[DailyUserV1]
WHERE
[Identity] = @userId AND Date = @endDate
UNION ALL
SELECT
emp.[Identity],
emp.[DisplayName],
emp.Title,
[Level] + 1,
emp.Manager
FROM
[data].[DailyUserV1] emp
INNER JOIN
OrganisationChart ON emp.Manager = OrganisationChart.[Identity]
WHERE
Date = @endDate
)
SELECT * FROM OrganisationChart;
END
GO
EXEC [dbo].[GetOrganizationChart] @identity = '7276DB4F-33B0-4074-9903-D95D740A8BF3', @date = '2015-08-03'
我已經排除了參數嗅探作爲一個可能的原因通過使用存儲過程中的局部變量。這裏發生了什麼?
UPDATE
這裏是鏈接到要看看,以防查詢執行計劃。
cte-without-stored-proc cte-with-stored-proc
我也懷疑局部變量'@ userId'和'@ endDate'是問題... – ForguesR
爲什麼你懷疑局部變量是問題?我第一次嘗試不使用任何本地變量,但它仍然有相同的問題 – user330612
你可以分享ad-hoc和存儲過程的執行計劃嗎? –