组合两个 SQL 查询以提高网络利用率

Posted

技术标签:

【中文标题】组合两个 SQL 查询以提高网络利用率【英文标题】:Combining Two SQL queries for Network Utilization 【发布时间】:2015-12-03 23:10:53 【问题描述】:

在组合两个 SQL 查询时寻求帮助(或提供关于可行性的意见。)我们的卫生局网络服务组单独使用这些查询来规划 WAN 带宽分配。我们的网络监控系统使用 MS SQL Server 2012 作为数据库。

当过去 30 天内 WAN 链接的平均利用率超过 90% 时,第一个查询会提取一个指标。这不是我创建的,但似乎是高度使用网络的良好代理。不知道为什么'where'子句中有两个日期时间语句:

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime

SET @StartDate =CAST((ROUND(CAST(GetDate() - 30 AS FLOAT), 0, 1)) as datetime) 
SET @EndDate = GetDate()

SELECT     
    Nodes.HA, 
    Nodes.Site, 
    Nodes.Address,
    Nodes.City,
    Nodes.SiteType,
    Interfaces.WANFeed, 
    (Interfaces.InBandwidth / 1000000) As Subscribed_Mbps,
    Count(*) as SaturationEvents

FROM
    Interfaces 
    INNER JOIN InterfaceTraffic_Detail ON Interfaces.InterfaceID = InterfaceTraffic_Detail.InterfaceID 
    INNER JOIN Nodes ON Interfaces.NodeID = Nodes.NodeID
WHERE      
    (NOT (Interfaces.WANFeed IS NULL)) 
    AND (InterfaceTraffic_Detail.DateTime > DATEADD(day, -30, GETDATE())) 
    AND (InterfaceTraffic_Detail.In_Averagebps / Interfaces.InBandwidth > .9)
    AND (Nodes.SiteType = 'Acute')
    AND (DateTime between @StartDate and @EndDate)

GROUP BY 
    Nodes.HA,
    Nodes.SiteType,
    Nodes.Site,
    Nodes.Address,
    Nodes.City, 
    Interfaces.WANFeed,
    Interfaces.InBandwidth

Order By SaturationEvents Desc

Sample output (cleaned)

HA  SITE    Address City    SiteType    WANFeed Subscribed_Mbps Saturation Events
--- --- --- --- Acute   Primary 10  252
--- --- --- --- Acute   Primary 10  152
--- --- --- --- Acute   Primary 100 104
--- --- --- --- Acute   Primary 10  57

我根据我们的 NMS 供应商提供的示例创建了第二个查询。它报告 95% 的利用率:

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime

SET @StartDate =CAST((ROUND(CAST(GetDate() - 30 AS FLOAT), 0, 1)) as datetime) 
SET @EndDate = GetDate()

SELECT  

Nodes.HA,
Nodes.Site,
Nodes.Address,
Nodes.City,
Interfaces.WANFeed,
Nodes.SiteType,
(Interfaces.InBandwidth / 1000000) As Subscribed_Mbps,
Interfaces.InterfaceId,
Nodes.NodeID,
Nodes.Caption AS NodeName,
Interfaces.Caption AS Interface_Caption,
Maxbps_In95,
Maxbps_Out95,
Maxbps_95

FROM Nodes
INNER JOIN Interfaces ON Nodes.NodeID = Interfaces.NodeID
INNER JOIN (
    SELECT  InterfaceID,
            dbo.GetInBps95th(InterfaceID,@StartDate ,@EndDate ) AS Maxbps_In95,
            dbo.GetOutBps95th(InterfaceID,@StartDate ,@EndDate ) AS Maxbps_Out95,
            dbo.GetMaxBps95th(InterfaceID,@StartDate ,@EndDate ) AS Maxbps_95
    FROM InterfaceTraffic
    WHERE InterfaceTraffic.DateTime >= @StartDate AND InterfaceTraffic.DateTime <= @EndDate 
    GROUP BY InterfaceID
) TrafficStat
ON Interfaces.InterfaceID = TrafficStat.InterfaceID

WHERE
(NOT (Interfaces.WANFeed IS NULL)) AND
(Nodes.SiteType = 'Acute') AND
(Interfaces.WANFeed <> 'Secondary') 

ORDER BY HA,NodeName, Interface_Caption

Sample Output (cleaned)

SITE    Address City    SiteType    WANFeed Subscribed_Mbps InterfaceID NodeID  Hostname    Interface_Caption   Maxbps_In95 Maxbps_Out95    Maxbps_95
--- --- --- Primary Acute   10000   25899   3516    --- --- 2.84E+08    3.92E+08    4.01E+08
--- --- --- Primary Acute   20000   23428   3508    --- --- 7.44E+08    3.50E+08    7.52E+08
--- --- --- Primary Acute   10000   23354   3508    --- --- 5.74E+08    4.61E+08    6.46E+08
--- --- --- Primary Acute   10000   23368   3508    --- --- 2.28E+08    4.59E+07    2.28E+08
--- --- --- Primary Acute   1000    11389   1232    --- --- 8.42E+07    8.55E+07    1.06E+08
--- --- --- Primary Acute   1000    29360   1234    --- --- 6.65E+07    3.95E+07    7.46E+07

我希望它们可以合并为一份报告(只有一些网站会饱和,但所有网站都会有 95%。)

感谢您花时间查看此内容。

【问题讨论】:

您是否尝试过左加入 2 个查询? 【参考方案1】:

首先,我认为它引起的混乱比直接组合到一个查询中更值得。但是,您可以声明两个临时表,从不同的查询中填充每个表,然后从表之间的连接中选择所需的结果集。

此外,查询似乎比必要的要复杂一些,只需稍作调整即可使其运行得更快并更清晰。我建议如下:

    不需要@EndDate 参数,因为查询一直运行到当前时间。因此,更改每个日期比较以查找 DateTime &gt;= @StartDate(NOT (Interfaces.WANFeed IS NULL)) 增加了不必要的复杂性。请改用(Interfaces.WANFeed IS NOT NULL)。 删除或澄清第一个查询中WHERE 子句末尾的AND (DateTime between @StartDate and @EndDate)。它看起来是多余的,并且不完全符合其正确别名。如果这是与第一次比较日期不同的字段,只需添加表别名以进行说明。

我希望所有这些都会有所帮助。

【讨论】:

感谢您的反馈——我将清理与日期相关的参数并研究临时表。如果我有任何进展,将重新发布。

以上是关于组合两个 SQL 查询以提高网络利用率的主要内容,如果未能解决你的问题,请参考以下文章

利用 SQL Server 过滤索引引提高查询语句的性能

在oracle里,一个sql多表查询,单独执行能利用索引提高速率,但外层套上分页时,会全表扫描,如何解决,求助高手

在 ORACLE SQL 中组合两个 SQL 查询以给出两个列

Mysql sql优化

提高 IDC 网络带宽利用率

提高 IDC 网络带宽利用率