我们有一个查询需要很长时间才能完成一个大型数据集。我想我已经将它追踪到 SQL 服务器中的表值函数。
该查询旨在返回两个日期之间的打印使用差异。因此,如果打印机在日期 x 使用 100,在日期 ya 使用 200,则需要返回行,这反映了它的使用更改为 100。
这些读数会定期(但不是每天)采集并存储在名为 MeterReadings 的表中。表值函数的代码如下。然后从另一个 SQL 查询中调用它,该查询将设备表上的返回表与内部连接连接起来,以获取额外的设备信息。
任何有关如何优化以下内容的建议将不胜感激。
ALTER FUNCTION [dbo].[DeviceUsage]
-- Add the parameters for the stored procedure here
( @StartDate DateTime , @EndDate DateTime )
RETURNS table
AS
RETURN
(
SELECT MAX(dbo.MeterReadings.ScanDateTime) AS MX,
MAX(dbo.MeterReadings.DeviceTotal - reading.DeviceTotal) AS TotalDiff,
MAX(dbo.MeterReadings.TotalCopy - reading.TotalCopy) AS CopyDiff,
MAX(dbo.MeterReadings.TotalPrint - reading.TotalPrint) AS PrintDiff,
MAX(dbo.MeterReadings.TotalScan - reading.TotalScan) AS ScanDiff,
MAX(dbo.MeterReadings.TotalFax - reading.TotalFax) AS FaxDiff,
MAX(dbo.MeterReadings.TotalMono - reading.TotalMono) AS MonoDiff,
MAX(dbo.MeterReadings.TotalColour - reading.TotalColour) AS ColourDiff,
MIN(reading.ScanDateTime) AS MN, dbo.MeterReadings.DeviceID
FROM dbo.MeterReadings INNER JOIN (SELECT * FROM dbo.MeterReadings WHERE
(dbo.MeterReadings.ScanDateTime > @StartDate) AND
(dbo.MeterReadings.ScanDateTime < @EndDate) )
AS reading ON dbo.MeterReadings.DeviceID = reading.DeviceID
WHERE (dbo.MeterReadings.ScanDateTime > @StartDate) AND (dbo.MeterReadings.ScanDateTime < @EndDate)
GROUP BY dbo.MeterReadings.DeviceID);