2012-10-17 28 views
0

此查询服用5秒:有什么办法来加速这个CTE?

With cte as 
(
    Select ROW_NUMBER() OVER (Order By dbo.GetLatestStatusDateTime(d.DocumentID)) peta_rn, d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, 
     d.IDate, d.InstrumentID, d.DocumentStatusID, u.Username, j.JDAbbreviation, inf.DocumentName, dbo.GetLatestStatusDateTime(d.DocumentID) as LatestStatusDatetime, 
     it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation 
       From Documents d Left Join IGroupes ig On d.IGroupID = ig.IGroupID 
       Left Join ITypes it On d.ITypeID = it.ITypeID 
       Left Join Users u On u.UserID = d.UserID 
       Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID 
       Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID 
       Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID Where 1 = 1 And d.JurisdictionID = 1 
) 
Select * from cte 
       Where 1 = 1 
       And peta_rn>92000 AND peta_rn<=92100 

虽然这是一个静态查询,这将是在这个意义上的动力,Order ByRow_Number()将根据什么用户选择。例如。目前它是dbo.GetLatestStatusDateTime(d.DocumentID),但它也可以是其他任何东西。因此,这个查询将在使用if和then的代码中生成。不管怎样,你能在我的查询中发现任何错误吗?为什么仅仅100个记录需要5秒?我已经看到了SQL服务器的规模高达数百万的记录,这只是1万元/ 10日,我从瓶颈:(

编辑痛苦:庞大的改善

更改查询到这一点:

With cte as 
(

     Select ROW_NUMBER() OVER (Order By d.DocumentID) peta_rn, d.DocumentID 
       From Documents d Left Join IGroupes ig On d.IGroupID = ig.IGroupID 
       Left Join ITypes it On d.ITypeID = it.ITypeID 
       Left Join Users u On u.UserID = d.UserID 
       Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID 
       Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID 
       Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID Where 1 = 1 And d.JurisdictionID = 1 
) 
Select d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, 
     d.IDate, d.InstrumentID, d.DocumentStatusID, u.Username, j.JDAbbreviation, inf.DocumentName, 
     it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation 
       From Documents d Left Join IGroupes ig On d.IGroupID = ig.IGroupID 
       Left Join ITypes it On d.ITypeID = it.ITypeID 
       Left Join Users u On u.UserID = d.UserID 
       Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID 
       Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID 
       Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID 
       Inner Join cte On cte.DocumentID = d.DocumentID 
       And peta_rn>92000 AND peta_rn<=92100 

执行在1秒钟内查询,但我还是觉得有1秒,只为100个记录太大了。任何其他的优化吗?

+1

所有这些'LEFT OUTER JOIN'都杀了你 - 我(再次)告诉你.....尝试CTE用'ROW_NUMBER()'函数只是对你最大的表 - 结果应该是几乎是即时的。另外:这些函数是什么('dbo.GetLatestStatusDateTime')做?他们正在访问数据库吗?这是另一个**巨大的**全能杀手... –

+0

你在做什么这个功能dbo.GetLatestStatusDateTime(d.DocumentID))。我想这是bottel的脖子 – AnandPhadke

+0

@marc_s:你能说出你的意思是什么最大的桌子?任何示例?你的意思是我应该先在Documents表上做Row_number?这是最大的一个。是dbo.GetLatestStatusDateTime正在访问数据库:( – Jack

回答

2

试试这个,这是一个很大的代码,而不知道编辑这些表格关系并不能对其进行测试。我希望这有帮助。

With d as 
(
    Select ROW_NUMBER() OVER (Order By d.DocumentID) peta_rn, 
    DocumentID, IsReEfiled, IGroupID, ITypeID, RecordingDateTime, 
    IDate, InstrumentID, DocumentStatusID, JurisdictionID, UserID 
    from Documents 
) 
Select d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, 
d.IDate, d.InstrumentID, d.DocumentStatusID, u.Username, j.JDAbbreviation, inf.DocumentName, 
it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation 
From d Left Join IGroupes ig On d.IGroupID = ig.IGroupID 
Left Join ITypes it On d.ITypeID = it.ITypeID 
Left Join Users u On u.UserID = d.UserID 
Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID 
Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID 
Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID 
where 
d.peta_rn>92000 AND d.peta_rn<=92100 
相关问题