2015-09-04 78 views
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

+1

我也懷疑局部變量'@ userId'和'@ endDate'是問題... – ForguesR

+0

爲什麼你懷疑局部變量是問題?我第一次嘗試不使用任何本地變量,但它仍然有相同的問題 – user330612

+2

你可以分享ad-hoc和存儲過程的執行計劃嗎? –

回答

1

我前面所面臨並且有參數嗅着同樣的問題。爲了克服這個問題,我使用臨時表而不是CTE,並且SP開始平穩運行。