我有一个带有设备的表,还有一个带有性能计数器的表。所以我有设备 A,可以说性能计数器表中有 1000 个条目。我正在尝试获取所有设备,其中 2500 台,以及它们最近的性能计数器。我使用了 Outer Apply,它确实实现了预期的结果,但查询需要 5 分钟才能执行。
这是获取我正在寻找的信息的最佳方式还是有更好的方式?这个查询的性能是否正常,我只是要求太多了?我正在考虑每晚创建第三个“临时”表来保存这些数据,以便我可以快速显示和查询信息。这样的最佳实践是什么?
这是我当前的查询:
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
只是设置了使速度增加的索引。