繁体   English   中英

用row_number()查询花费太多时间

[英]Query with row_number() taking too much time

我的数据库中大约有9万条记录,并且运行以下查询:

这需要太多时间(大约4秒):

SELECT * FROM (SELECT 
    ROW_NUMBER() OVER (Order By DocumentID desc) peta_rn, peta_query.* From 
    (
            Select   d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, dbo.GetLatestStatusDateTime(d.DocumentID) as LatestStatusDatetime, 
                    dbo.FnCanChangeDocumentStatus(d.DocumentStatusID,d.DocumentID) as CanChangeStatus, d.IDate, d.InstrumentID, d.DocumentStatusID,ig.Abbreviation as IGroupAbbreviation, 
                    u.Username, j.JDAbbreviation, inf.DocumentName,
                    it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation,
                    dbo.GetFlatDocumentName(d.DocumentID) as FlatDocumentName 
                    From Documents d Inner 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 
                            Inner Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID                           
    ) as peta_query) peta_paged WHERE peta_rn>12000 AND peta_rn<=12100

但是,此第二个查询将在1秒内执行:

SELECT * FROM (SELECT 
    peta_query.* From 
    (
            Select  ROW_NUMBER() OVER (Order By d.DocumentID desc) peta_rn, d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, dbo.GetLatestStatusDateTime(d.DocumentID) as LatestStatusDatetime, 
                    dbo.FnCanChangeDocumentStatus(d.DocumentStatusID,d.DocumentID) as CanChangeStatus, d.IDate, d.InstrumentID, d.DocumentStatusID,ig.Abbreviation as IGroupAbbreviation, 
                    u.Username, j.JDAbbreviation, inf.DocumentName,
                    it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation,
                    dbo.GetFlatDocumentName(d.DocumentID) as FlatDocumentName 
                    From Documents d Inner 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 
                            Inner Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID                           
    ) as peta_query) peta_paged WHERE peta_rn>12000 AND peta_rn<=12100

我的问题是:

1)您能否建议为什么我的第一个查询要花这么长时间执行? 我想优化我的第一个查询,因为它是由一个自动程序生成的(我有它的源,但是我不能在Select内移动RowNumber)。

2)执行此操作的时间还取决于peta_rn。 如果我给peta_rn> 50000并且peta_rn <= 50100,则执行该程序将花费无望的时间。 您能否也提出一个建议,为什么执行时间取决于我要获取的行,因为最终我一次只能获取100行。

只是为了好玩-您可以尝试此CTE并查看其性能吗? 我不完全理解为什么您在那里有三个嵌套子查询。

;WITH PetaQuery AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY d.DocumentID DESC) peta_rn, 
        d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, 
        dbo.GetLatestStatusDateTime(d.DocumentID) as LatestStatusDatetime, 
        dbo.FnCanChangeDocumentStatus(d.DocumentStatusID,d.DocumentID) as CanChangeStatus, 
        d.IDate, d.InstrumentID, d.DocumentStatusID,ig.Abbreviation as IGroupAbbreviation, 
        u.Username, j.JDAbbreviation, inf.DocumentName,
        it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation,
        dbo.GetFlatDocumentName(d.DocumentID) as FlatDocumentName 
    FROM 
        Documents d 
    INNER JOIN 
        IGroupes ig On d.IGroupID = ig.IGroupID 
    LEFT OUTER JOIN 
        ITypes it On d.ITypeID = it.ITypeID 
    LEFT OUTER JOIN 
        Users u On u.UserID = d.UserID 
    LEFT OUTER JOIN 
        DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID 
    LEFT OUTER JOIN 
        InstrumentFiles inf On d.DocumentID = inf.DocumentID 
    INNER JOIN 
        Jurisdictions j on j.JurisdictionID = d.JurisdictionID                           
) 
SELECT * FROM PetaQuery
WHERE peta_rn > 12000 AND peta_rn <= 12100

这与原始查询具有相同的响应时间吗?

如果是这样,请检查:

  • 您在所有外键( IGroupIDITypeIDUserIDDocumentStatusIDDocumentIDJurisdictionID )上都有索引吗? 这对于提高JOIN性能至关重要

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM