我的存儲過程的目標是當我發送InstrumentID
到存儲過程我想獲得最新值ChannelDescription
(通過datetime
和該時間的值)SQL Server - 循環遍歷表並獲取最新值和日期(性能問題)
我有3個表:Instruments < Channels < Datum
儀器
- InstrumentID
- INSTRUMENTNAME
頻道
- 的channelID
- InstrumentID
- ChannelDescription
- 量表
基準
- DatumId
- 渠道ID
- DATATIME
- NumericValue
下面的存儲過程的作品,但它是超慢:
ALTER PROCEDURE [dbo].[GetDataLastValue]
@InstrumentID INT
AS
BEGIN
SELECT
InstrumentId,
c.ChannelId, c.DataTime,
CONVERT(DECIMAL(38, 4), (NumericValue/c.Scale)) AS NumericValue,
c.Diag, ChannelDescription
FROM
dbo.Instrument
LEFT JOIN
(SELECT
ChannelId,
MAX(DateTime) as DataTime,
(SELECT TOP 1 NumericValue
FROM dbo.Datum
WHERE ChannelId = t.ChannelId
ORDER BY DateTime DESC) AS NumericValue,
(SELECT TOP 1 InstrumentId
FROM dbo.Channel
WHERE Channel.ChannelId = t.ChannelId) AS myinst,
(SELECT Scale
FROM dbo.Channel
WHERE Channel.ChannelId = t.ChannelId) AS Scale,
(SELECT Diag
FROM dbo.Channel
WHERE Channel.ChannelId = t.ChannelId) AS Diag,
(SELECT ChannelDescription
FROM dbo.Channel
WHERE Channel.ChannelId = t.ChannelId) AS ChannelDescription
FROM
dbo.Datum as t
GROUP BY ChannelId) c ON c.myinst = Instrument.InstrumentId
WHERE
InstrumentId = @InstrumentID AND c.Diag = 0
ORDER BY
ChannelDescription
END
你的SP將無法正常工作時的3個查詢返回一個大於1分的結果:'(SELECT規模,由dbo.Channel WHERE Channel.ChannelId = t.ChannelId)','(SELECT DIAG FROM dbo.Channel WHERE Channel.ChannelId = t.ChannelId)','(SELECT ChannelDescription FROM dbo.Channel WHERE Channel.ChannelId = t.ChannelId)' – TriV
@ TriV另一方面,ChannelId很可能是Channel表的主鍵,所以這不會發生。 –