我有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
答案 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)