1

2 つの SQL クエリを組み合わせる際の支援を求めています (または実現可能性についての意見を提供してください)。これらは、WAN 帯域幅の割り当てを計画するために、当社の保健局ネットワーク サービス グループによって個別に使用されます。当社のネットワーク監視システムは、MS SQL Server 2012 をデータベースとして使用しています。

最初のクエリは、WAN リンクの平均使用率が過去 30 日間で 90% を超えたときにメトリックを引き出します。これは私が作成したものではありませんが、使用頻度の高いネットワークに適したプロキシのようです。「where」句に2つの日時ステートメントがある理由がわかりません:

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 ベンダーから提供された例に基づいて、2 番目のクエリを作成しました。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

私の希望は、それらを 1 つのレポートに結合できることです (一部のサイトのみが飽和し、すべてのサイトが 95 パーセンタイルになります)。

これを見てくれてありがとう。

4

1 に答える 1

0

まず、1 つのクエリに直接結合する価値がある以上に混乱を招くと思います。ただし、2 つの一時テーブルを宣言し、異なるクエリから各テーブルに入力してから、テーブル間の結合から目的の結果セットを選択することができます。

さらに、クエリは必要以上に複雑であるように思われますが、わずかな微調整で実行速度を上げ、より明確にすることができます。次のことをお勧めします。

  1. @EndDateクエリは現在の時刻まで実行されているため、パラメーターは必要ありません。したがって、各日付比較を を探すように変更しますDateTime >= @StartDate
  2. (NOT (Interfaces.WANFeed IS NULL))不必要な複雑さを追加します。(Interfaces.WANFeed IS NOT NULL)代わりに使用してください。
  3. 最初のクエリの句AND (DateTime between @StartDate and @EndDate)の末尾にある を削除または明確にします。WHERE冗長に見え、適切なエイリアスで完全修飾されていません。これが最初の日付の比較とは異なるフィールドである場合は、明確にするためにテーブル エイリアスを追加してください。

これがすべて役立つことを願っています。

于 2015-12-04T02:48:11.683 に答える