2016-08-04 51 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列,请忘记此字段。您可能必须删除独特的子句。 –