当记录增加时,Sql存储过程需要更多时间来执行以优化它

时间:2012-02-07 08:50:09

标签: performance sql-server-2008

enter image description here我有6,00,000条记录,我想从它们中获取10条记录,因为我想在网格中只显示10条记录,当我在1-10000 EG之间获取记录时,我的存储过程正常工作500-510)之后,当行号增加时执行时间增加EG如果我获取记录b / w 1,00,000-1,00,010则需要更多时间来执行

任何人都可以帮助我,我已经使用ROW_NUMBER()获取数字行号,并用于检索数据。

请提供优化的记录方式

存储过程创建一个sql查询,如下所示

我有6,00,000条记录,我想从它们中获取10条记录,因为我想在网格中只显示10条记录,当我在1-10000 EG(500-510)之间获取记录后,我的存储过程正常工作当行号增加时执行时间增加EG如果我获取记录b / w 1,00,000-1,00,010则需要更多时间来执行

任何人都可以帮助我,我已经使用ROW_NUMBER()获取数字行号,并用于检索数据。

请提供优化的记录方式

存储过程创建一个sql查询,如下所示

    SELECT FuelClaimId from  

     (  SELECT fc.FuelClaimId,ROW_NUMBER() OVER ( order by fc.FuelClaimId ) AS RowNum  
    from   FuelClaims fc   

      INNER JOIN Vehicles v on fc.VehicleId =v.VehicleId     

        INNER JOIN Drivers d on d.DriverId =v.OfficialID  

        INNER JOIN Departments de on de.DepartmentId =d.DepartmentId   

        INNER JOIN Provinces p on de.ProvinceId =p.ProvinceId  

        INNER JOIN FuelRates f on f.FuelRateId =fc.FuelRateId   

        INNER JOIN FuelClaimStatuses fs on fs.FuelClaimStatusId= fc.statusid

        INNER JOIN LogsheetMonths  l on l.LogsheetMonthId  =f.LogsheetMonthId

        Where fc.IsDeleted = 0) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 
    600000 And 600010

2 个答案:

答案 0 :(得分:1)

请改为尝试:

SELECT TOP 10 fc.FuelClaimId
FROM FuelClaims fc
    INNER JOIN Vehicles v ON fc.VehicleId = v.VehicleId     
    INNER JOIN Drivers d ON d.DriverId = v.OfficialID  
    INNER JOIN Departments de ON de.DepartmentId = d.DepartmentId   
    INNER JOIN Provinces p ON de.ProvinceId = p.ProvinceId  
    INNER JOIN FuelRates f ON f.FuelRateId = fc.FuelRateId   
    INNER JOIN FuelClaimStatuses fs ON fs.FuelClaimStatusId = fc.statusid
    INNER JOIN LogsheetMonths  l ON l.LogsheetMonthId = f.LogsheetMonthId
WHERE fc.IsDeleted = 0 AND fc.FuelClaimId BETWEEN 600001 AND 600010 
ORDER BY fc.FuelClaimId

BETWEEN也包括在内,所以BETWEEN 10和20实际上返回10,11,12,13,14,15,16,17,18,19和20所以11行不是10.因为身份值通常从1开始你真的想要BETWEEN 11 AND 20(因此上面的600001)

上述查询应解决您在查询较大范围的项目时性能下降的问题。

虽然它不会总是返回10条记录,但修复方法是:

WHERE fc.IsDeleted = 0 AND fc.FuelClaimId > @LastMaxFuelClaimId

其中@LastMaxFuelClaimId是您从上一次查询执行返回的前一个MAX FuelClaimId。

编辑:它继续变慢的原因是因为它必须读取越来越多的表来读取下一个块,它不会跳过读取它们全部读取的前600,000条记录然后只返回下一个因此,每当你查询它再次读取所有以前的记录时,上面都没有遇到同样的问题。

答案 1 :(得分:0)

您应该发布执行计划,但可能导致性能问题不充分或缺乏索引。

确保您有

  • 所有外键关系的索引
  • 您检索并从
  • 中选择的字段的覆盖索引

覆盖索引

CREATE INDEX IX_FUELCLAIMS_FUELCLAIMID_ISDELETED 
  ON dbo.FuelClaims (FuelClaimId, VehicleID, IsDeleted)