查找每个服务器发生的值

时间:2014-03-25 13:41:55

标签: sql-server tsql sql-server-2012

我每小时测量一次所有服务器中所有数据库的大小。 此信息存储在一个简单的表中:

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?

2 个答案:

答案 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