2016-08-04 48 views
-1

我有以下查詢: 它比一分鐘採取更多...我需要提高性能,並把它不到10秒。如何提高此查詢的性能?它超過一分鐘?

欣賞您的回覆。

SELECT 
DISTINCT 
RP.RegionPerilID 
,RP.RegionName + ' ' + RP.ShortName AS RegionPerilName 
,LossLevelID 
,LL.LossLvlName AS LossLevelName 
FROM Axis_Accumulation.dbo.AIREventSet ES 
     JOIN Axis_Accumulation.dbo.vw_RegionPerils RP ON RP.RegionPerilId = ES.RegionPerilId 
     JOIN ART.LA.ELT_Blend ELT WITH (NOLOCK) ON ES.EventNum = ELT.EventNum AND ELT.Versionid = @versionId 
     JOIN dbo.LA_LossLevel LL ON ELT.LossLevelID = LL.LossLvlID AND LL.LosstypeId = 3 -- Line of Business 
     ORDER By RegionPerilName 
+5

你有一些執行計劃?每個表中有多少個記錄? –

+4

執行計劃,表格結構和索引將需要提供很多幫助。與此同時,你可能會考慮在那裏擺脫那個NOLOCK,除非你大多數時候對大多數準確的數據都可以。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+2

你對,你可以在命令用於查詢的運行速度表的所有索引?確保你正確地加入表格。 – JT4U

回答

1

你應該嘗試創建這些指標,如果他們不是已經存在:

CREATE NONCLUSTERED INDEX IX_AIREventSet ON Axis_Accumulation.dbo.AIREventSet 
(
    RegionPerilID 
) 
INCLUDE 
(
    EventNum 
) 

CREATE NONCLUSTERED INDEX IX_AIREventSet_EvenNum ON Axis_Accumulation.dbo.AIREventSet 
(
    EventNum 
) 


CREATE NONCLUSTERED INDEX IX_vw_RegionPerils ON Axis_Accumulation.dbo.vw_RegionPerils 
(
    RegionPerilID 
) 
INCLUDE 
(
    RegionName, 
    ShortName 
) 


CREATE NONCLUSTERED INDEX IX_ELT_Blend ON ART.LA.ELT_Blend 
(
    EventNum, 
    Versionid, 
) 
INCLUDE 
(
    LossLevelID 
) 

CREATE NONCLUSTERED INDEX IX_ELT_Blend_LossLevelID ON ART.LA.ELT_Blend 
(
    LossLevelID 
) 



CREATE NONCLUSTERED INDEX IX_LA_LossLevel ON dbo.LA_LossLevel 
(
    LossLvlID, 
    LosstypeId 
) 
INCLUDE 
(
    LossLvlName 
) 

如果在下面的列表,這些字段是唯一的,在索引定義添加UNIQUE子句。 INCLUDE語句很重要,因爲它通過查找一個索引來獲取所有數據。 逐個添加索引,並檢查執行計劃是否被使用。如果沒有,你可以刪除它。

最後這個指標應該有助於排序的數據!

CREATE CLUSTERED UNIQUE INDEX IX_AIREventSet_Clustered ON Axis_Accumulation.dbo.AIREventSet 
(
    RegionName, 
    ShortName, 
    RegionPerilID, 
    [YourTableId] 
) 
+0

羅喜上....這[YourTableId]在過去的指標是什麼?我在這張桌子上沒有任何標識欄。 – Rita

+0

如果您有任何Idenity列,請忘記此字段。您可能必須刪除獨特的子句。 –