我每小时测量一次所有服务器中所有数据库的大小。 此信息存储在一个简单的表中:
CREATE TABLE [dbo].[DB_Sizes](
[DB_sizes_id] [int] IDENTITY(1,1) NOT NULL,
[Server] [nvarchar](max) NOT NULL,
[Time_of_measurement] [datetime] NOT NULL,
[Databasenaam] [nvarchar](50) NULL,
[DataFileSizeMB] [int] NULL,
[LogFileSizeMB] [int] NULL)
Time_of_measurement
中存储的日期四舍五入为小时:例如2014-03-25 13:00:00.000
问题在于并非每台服务器都在同一时间进行测量。所以我可以举个例子:
server1 2014-03-25 09:00:00.000
server1 2014-03-25 10:00:00.000
server1 2014-03-25 11:00:00.000
server2 2014-03-25 09:00:00.000
server2 2014-03-25 10:00:00.000
server2 2014-03-25 13:00:00.000
server3 2014-03-25 08:00:00.000
server3 2014-03-25 09:00:00.000
server3 2014-03-25 10:00:00.000
server3 2014-03-25 13:00:00.000
如您所见,server1尚未在2014-03-25 13:00:00.000进行测量。在其他日子,它可能是尚未测量的server3。明天可能是服务器2落后了。
现在,我正在寻找每个服务器'发生的最强最近衡量标准。
保证在同一小时内测量所有服务器的时刻,因此具有相同的Time_of_measurement值
在上面的示例中,所需值为2014-03-25 10:00:00.000
服务器的数量可以不同,现在有3个,它将运行多达10个以上的服务器。
因此,为每个服务器简单地将表连接到自身并不是一个可行的解决方案。
连连呢? PLZ?
答案 0 :(得分:2)
我将服务器返回的每一组视图作为单独的数据集查看。收集这些集合并使用INTERSECT操作。
使用您的测试数据:
CREATE TABLE #server1 (measurement datetime NOT NULL)
CREATE TABLE #server2 (measurement datetime NOT NULL)
CREATE TABLE #server3 (measurement datetime NOT NULL)
INSERT INTO #server1 VALUES ('2014-03-25 09:00:00.000'), ('2014-03-25 10:00:00.000'), ('2014-03-25 11:00:00.000')
INSERT INTO #server2 VALUES ('2014-03-25 09:00:00.000'), ('2014-03-25 10:00:00.000'), ('2014-03-25 13:00:00.000')
INSERT INTO #server3 VALUES ('2014-03-25 08:00:00.000'), ('2014-03-25 09:00:00.000'), ('2014-03-25 10:00:00.000'), ('2014-03-25 13:00:00.000')
SELECT MAX(measurement)
FROM (
SELECT measurement from #server1
INTERSECT
SELECT measurement from #server2
INTERSECT
SELECT measurement from #server3
) as a
这将返回' 2014-03-25 10:00:00'。
答案 1 :(得分:0)
如果我理解你,你想要每台服务器的最近时间,如果它是正确的,你可以运行这个查询
Select Server, max([Time_of_measurement]) mostRecentMeasurement From [dbo].[DB_Sizes]
group by Server