2009-08-24 33 views
0

這個查詢用於SQL2000中的3secs,現在大約需要70secs。兩個數據庫都提供相同的結果。 2005數據庫未以兼容模式運行。SQL2000到SQL2005。查詢現在慢很多

目前我們正在重建查詢以在SQL2005中運行..通過消除和理解邏輯的過程。

但是 - 誰能看到我們錯過的任何明顯的東西。

和/或有什麼工具可以幫助嗎?

我們一直在尋找執行計劃...和分析器。和索引調整嚮導。

事件探查器指向大量更多的記錄被查詢以獲得相同的結果。

我知道這是一個非常難調試的問題,如果沒有數據......另一雙眼睛總是很好,如果有什麼明顯的!

乾杯

戴夫

ALTER   PROCEDURE [dbo].[GetNodeList] 
@ViewID int, 
@UserID int = null 
as 

Select ProcessList.*, 
A.NDOC_DOC_ID, 
A.NDOC_Order, 
A.OMNIBOOK_ID, 
A.Node_Order 
from (
    (SELECT N.NOD_ID, 
    N.NOD_Name, 
    N.NOD_Procname, 
    N.NOD_Xpos, 
    N.NOD_Ypos, 
    N.NOD_Zpos, 
    VN.VNOD_VIE_ID 
    FROM Node N 
    INNER JOIN View_NODe VN 
    ON N.NOD_ID = VN.VNOD_NOD_ID 
    Where VN.VNOD_VIE_ID = @ViewID) ProcessList 
Left Join 
(
    SELECT N.NOD_ID, 
    N.NOD_Name, 
    N.NOD_Procname, 
    N.NOD_Xpos as NOD_Xpos, 
    N.NOD_Ypos as NOD_Ypos, 
    N.NOD_Zpos as NOD_Zpos, 
    VN.VNOD_VIE_ID, 
    ND.NDOC_DOC_ID as NDOC_DOC_ID, 
    ND.NDOC_Order as NDOC_Order, 
    null as OMNIBOOK_ID, 
    null as Node_Order 
    FROM Node N 
    INNER JOIN View_NODe VN 
    ON N.NOD_ID = VN.VNOD_NOD_ID 
    LEFT JOIN NODe_DOCument ND 
    ON N.NOD_ID = ND.NDOC_NOD_ID 
    WHERE [email protected] 
    and ND.NDOC_DOC_ID is not null 

    and (@UserID is null 
     or exists (Select 1 
       from Document D 
       where Doc_ID = ND.NDOC_DOC_ID 
       and dbo.fn_UserCanSeeDoc(@UserID,D.Doc_ID)<>0 
     ) 
    ) 

    UNION 

    SELECT N.NOD_ID, 
    N.NOD_Name, 
    N.NOD_Procname, 
    N.NOD_Xpos, 
    N.NOD_Ypos, 
    N.NOD_Zpos, 
    VN.VNOD_VIE_ID, 
    null, 
    null, 
    NOM.OMNIBOOK_ID, 
    NOM.Node_Order 
    FROM Node N 
    INNER JOIN View_NODe VN 
    ON N.NOD_ID = VN.VNOD_NOD_ID 
    LEFT JOIN NODe_OMNIBOOK NOM 
    ON N.NOD_ID = NOM.NODE_ID 
    WHERE [email protected] 
    and NOM.OMNIBOOK_ID is not null 
    and exists (select 1 from Omnibook_Doc where OmnibookID = NOM.OMNIBOOK_ID) 
) A 
--On ProcessList.NOD_ID = A.NOD_ID 
ON ProcessList.NOD_Xpos = A.NOD_Xpos 
And ProcessList.NOD_Ypos = A.NOD_Ypos 
And ProcessList.NOD_Zpos = A.NOD_Zpos 
And ProcessList.VNOD_VIE_ID = A.VNOD_VIE_ID 
) 
ORDER BY 
ProcessList.NOD_Xpos, 
ProcessList.NOD_Zpos, 
ProcessList.NOD_Ypos, 
Coalesce(A.NDOC_Order,A.Node_Order), 
Coalesce(A.NDOC_DOC_ID,A.OMNIBOOK_ID) 
+2

如果你張貼在文本格式的查詢計劃你可能會得到更多的幫助 - 所以人們可以看到他們的投入是什麼查詢運算符是什麼。您還需要提供有關現有索引的信息。 – Sam 2009-08-24 07:21:16

回答

0

大學已經想出了一個解決方案...關於將函數fn_UserCanSeeDoc帶回到SQL中。

下面顯示的是舊註釋掉的功能代碼,然後是它下面的新內聯SQL。代碼現在運行超級快(從1分鐘到大約一秒)

看着舊的SQL,我很驚訝SQL2000運行它的工作有多棒!

乾杯

--and dbo.fn_UserCanSeeDoc(@UserID,D.Doc_ID)<>0 

-- if exists(Select 1 from Omnibook where Omnibook_ID = @DocID) 
--  Begin 
--   Set @ReturnVal = 1 
--  End 
-- 
-- else 
--  Begin 
--   if exists(
--    Select 1 
--    from UserSecurityModule USM 
--    Inner join DocSecurity DS 
--    On USM.SecurityModuleID = DS.SecurityModuleID 
--    where USM.UserID = @UserID 
--    and DS.DocID = @DocID 
--   ) 
--   
--    Set @ReturnVal = 1 
--   
--   else 
--     
--    Set @ReturnVal = 0 
--  End 

AND D.Doc_ID IN (select DS.DocID from UserSecurityModule USM 
       Inner join DocSecurity DS 
       On USM.SecurityModuleID = DS.SecurityModuleID 
       where USM.UserID = @UserID) 
1

有沒有可能是你的統計數據還沒有碰到過?在2k5 dbase中?那麼數據庫沒有制定好計劃所需的信息?與舊的數據庫相比,在桌面上有很好的統計數據,並且可以爲數據選擇更好的計劃?

+2

爲了配合這一點,你是否升級了更新了統計數據? – mrdenny 2009-08-24 13:00:01

+0

仍然神祕如何SQL 2000做了這麼好的工作..看到代碼如下:-) – 2009-08-25 21:23:57

2

在統計數據沒有跟上數據的時候,我已經看到過這個。在這種情況下,SQL Server 2005可能對SQL Server 2000使用不同的統計信息。嘗試重新構建查詢中使用的表的統計信息;所以對於每個表:

UPDATE STATISTICS <table> WITH FULLSCAN 

是的,我想補充的FULLSCAN除非你知道不夠好,覺得記錄的樣品將給出足夠好的結果數據。它會減慢統計數據的創建速度,但會使其更加準確。

+0

嗨 - 試過..非常感謝: EXEC sp_MSforeachtable @ command1 =「print'?'DBCC DBREINDEX('?','',80)「 EXEC sp_MSforeachtable @ command1 =」UPDATE STATISTICS? WITH FULLSCAN「 – 2009-08-25 21:23:17

+0

@Dave - 它是否有所作爲? – 2009-08-26 11:55:49

0

它可能是一個「參數嗅探」的問題,即SQL Server緩存爲第一次執行提供的參數進行了優化的查詢計劃? Microsoft technet has more