デバイスを含むテーブルと、パフォーマンス カウンターを含む 2 つ目のテーブルがあります。したがって、デバイス A には、パフォーマンス カウンター テーブルに 1000 のエントリがあるとします。すべてのデバイス、2500 台のデバイス、およびそれらの最新のパフォーマンス カウンターを取得しようとしています。Outer Apply を使用しましたが、これで目的の結果が得られましたが、クエリの実行に 5 分かかりました。
これは私が探している情報を取得するための最良の方法ですか、それとももっと良い方法がありますか? このクエリのパフォーマンスは正常ですか?質問が多すぎますか? このデータを保持する 3 番目の「一時」テーブルを夜間に作成して、情報をすばやく表示およびクエリできるようにすることを考えています。このようなもののベストプラクティスは何ですか?
これが私の現在のクエリです:
select * from Device D
OUTER APPLY
( select top 1 *
FROM PerformanceCounterValues
where instance_id = D.pkid
order by collection_time desc
) as tbl2
----- 解決済み ----
これが私の最終的な実際のクエリで、0 秒で機能します。
SELECT pkid, D.IDDevice, D.IDHardware, H.IDRecorder, D.Name, D.Description, H.Name as HardwareName, H.URI, R.HostName, R.Name as RecorderInstance, tbl2.collection_time, tbl2.raw_value, tbl2.calculated_value
FROM [Surveillance].[dbo].[PerformanceCounterInstance] PCI
JOIN [Surveillance].[dbo].[Devices] D on D.IDDevice = (SELECT REPLACE(STUFF([instance_name],1,CHARINDEX('[',[instance_name]),''),']',''))
JOIN [Surveillance].[dbo].[Hardware] H on H.IDHardware = D.IDHardware
JOIN [Surveillance].[dbo].[Recorders] R on R.IDRecorder = H.IDRecorder
OUTER APPLY
( select top 1 *
FROM [Surveillance].[dbo].[PerformanceCounterValue]
where instance_id = PCI.pkid
order by collection_time desc
) as tbl2
where category_name = 'VideoOS Recording Server Device Storage'
and D.Enabled = 1
速度を上げるのはインデックスを設定するだけでした。