У нас есть запрос, который занимает очень много времени, чтобы заполнить большой набор данных. Я думаю, что я отследил его до функции table-value на SQL-сервере.Оптимизация/улучшение функции табличных значений SQL
Запрос предназначен для возврата разницы в использовании печати между двумя датами. Поэтому, если на принтере было использовано 100 на дату x и 200 на дату, то строка должна быть возвращена, что отражает изменение использования 100.
Эти данные берутся периодически (но не каждый день) и сохраняются в таблице под названием MeterReadings. Код для функции table-value приведен ниже. Затем он вызывается из другого 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);
Эта функция выполняет только то, что вы просите, если значения только увеличиваются. Может ли какое-либо из значений когда-либо уменьшаться с одной даты на другую? – MatBailie
Кроме того, если есть чтение на 1-м, то 3-е, но ваш @startDate является вторым, какая дата должна быть в первом чтении? Я понимаю, что он должен быть первым, но здесь используется третий. – MatBailie
Спасибо за ответ. Поле, которое установлено в значение false, если чтение идет вниз, поэтому я могу довольно легко отфильтровать его. В контексте приложения я бы никогда не ожидал, что использование снизится. Также в ответ на ваш второй пункт ваше предположение верно. Запрос должен вернуться с 1-го. –