大規模なデータセットで完了するのに非常に長い時間がかかるクエリがあります。SQLサーバーのテーブル値関数まで追跡したと思います。
クエリは、2 つの日付間の印刷使用量の違いを返すように設計されています。そのため、プリンタの使用量が 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);