Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否可以改进此TSQL查询?_Sql Server_Tsql - Fatal编程技术网

Sql server 是否可以改进此TSQL查询?

Sql server 是否可以改进此TSQL查询?,sql-server,tsql,Sql Server,Tsql,我刚刚遇到一个随机问题,下面的查询开始出错。不确定这是否是侥幸,因为我使用此查询创建报告,并且在过去一年中每天至少使用过几次。今天早上,我接到一个来自我的SQL DBA的电话,告诉我查询从周四早上就开始运行了。查询本身通常需要15-30秒才能运行 非常感谢您的快速回复。我现在就给这个打一针,然后回去报告。谢谢工作得很有魅力。将查询时间减少了10秒,执行路径更加干净 SELECT AllAlerts.AlertID as AlertID, Queues.QueueID as QueueID,

我刚刚遇到一个随机问题,下面的查询开始出错。不确定这是否是侥幸,因为我使用此查询创建报告,并且在过去一年中每天至少使用过几次。今天早上,我接到一个来自我的SQL DBA的电话,告诉我查询从周四早上就开始运行了。查询本身通常需要15-30秒才能运行


非常感谢您的快速回复。我现在就给这个打一针,然后回去报告。谢谢工作得很有魅力。将查询时间减少了10秒,执行路径更加干净
SELECT
AllAlerts.AlertID as AlertID,
Queues.QueueID as QueueID,
Queues.QueueName as QueueName,
AllAlerts.ConnectorID as ConnectorID,
cast( ISNULL(STUFF ( (
    select cast(',' as varchar(max)) + Services.Label 
    from (
        SELECT distinct Services.Label 
        from [ISG_SOI ].[dbo].[SecureServiceCI] as Services

        inner join [ISG_SOI ].[dbo].[CIRelationship] as Relationship
        on Relationship.BNodeCIID = AllAlerts.CIID

        where Services.CIID = Relationship.ServiceCIID
    ) as Services
    for xml path ('')
), 1, 1, ''), '') as CHAR(1000)) as OwnedServices,
SUBSTRING(AllAlerts.DeviceID, 
    ISNULL(2 + LEN(AllAlerts.DeviceID) - NULLIF(CHARINDEX(',', REVERSE(AllAlerts.DeviceID)), 0), 0), 
    CASE CHARINDEX(':', AllAlerts.DeviceID) WHEN 0 THEN LEN(AllAlerts.DeviceID) + 1 ELSE CHARINDEX(':', AllAlerts.DeviceID) END - 
    ISNULL(2 + LEN(AllAlerts.DeviceID) - NULLIF(CHARINDEX(',', REVERSE(AllAlerts.DeviceID)), 0), 0)
) AS CIName,
AllAlerts.DeviceID as DeviceID,
AllAlerts.SituationMessage as Summary,
AllAlerts.AlertDetail as Detail,
AllAlerts.Acknowledged as Acknowledged,
AllAlerts.UserAttribute5 as Occurrences,
"AcknowledgedBy" = 
    CASE
        WHEN AllAlerts.Acknowledged = '1' THEN ISNULL(History.CreatedBy, '')
        WHEN AllAlerts.Acknowledged = '0' THEN ' '
    END,
AllAlerts.AssignedTo as AssignedTo,
DATEADD(HOUR, DATEDIFF (HH, GETUTCDATE(), GETDATE()), AllAlerts.ReportedTime) as CreatedTime,
DATEADD(HOUR,DATEDIFF (HH, GETUTCDATE(), GETDATE()), AllAlerts.ClearedTime) as ClearedTime,
"Severity" = 
    CASE
        WHEN AllAlerts.Severity = '4' THEN 'Down'
        WHEN AllAlerts.Severity = '3' THEN 'Critical'
        WHEN AllAlerts.Severity = '2' THEN 'Major'
        WHEN AllAlerts.Severity = '1' THEN 'Minor'
    END,
AllAlerts.SvcDeskTicket as TicketID,
ISNULL(STUFF ( (
        select cast('# ' as varchar(max)) + Notes.AnnotationText + '[' + Notes.CreatedBy + ', ' + cast(Notes.CreatedTime as varchar(max)) + ']'
        from [ISG_SOI ].[dbo].[AlertAnnotation] as Notes
        where Notes.AlertID = AllAlerts.AlertID
        for xml path('')
    ), 1, 1, ''), '') as Notes

from 
[ISG_SOI ].[dbo].[Alerts] as AllAlerts

inner join [ISG_SOI ].[dbo].[AlertQueueAssignments] as QA 
    on QA.[AlertID] = AllAlerts.[AlertID]
inner join [ISG_SOI ].[dbo].[AlertQueues] AS Queues 
    on Queues.[QueueID] = QA.[QueueID]

left join 
(
    select History.AlertID, max(History.CreatedBy) as CreatedBy
      from [ISG_SOI ].[dbo].[AlertHistory] as History
     where History.ColumnName = '73549'
       and History.Currentvalue = 'true'
     group by History.AlertID
) as History
  on History.AlertID  = AllAlerts.AlertID 
--try this, variant using temp tables

--remove calculation from subquery to temp table
--------------------------------------------------------------------------------
IF OBJECT_ID('tempdb..#History') IS NOT NULL 
    DROP TABLE #History
SELECT  History.AlertID ,
        MAX(History.CreatedBy) AS CreatedBy
INTO    #History
FROM    [ISG_SOI ].[dbo].[AlertHistory] AS History
        INNER JOIN [ISG_SOI ].[dbo].[Alerts] AS AllAlerts
        ON History.AlertID = AllAlerts.AlertID
WHERE   History.ColumnName = '73549'
        AND History.Currentvalue = 'true'
GROUP BY History.AlertID
-------------------------------------------------------------------------------------
--XML agregation also is too expensive, reduce time thro removing not required data--
-------------------------------------------------------------------------------------
--1.
IF OBJECT_ID('tempdb..#Services') IS NOT NULL 
    DROP TABLE #Services
SELECT DISTINCT
        Relationship.BNodeCIID ,
        [Services].Label
INTO    #Services
FROM    [ISG_SOI ].[dbo].[SecureServiceCI] AS [Services]
        INNER JOIN [ISG_SOI ].[dbo].[CIRelationship] AS Relationship
        ON [Services].CIID = Relationship.ServiceCIID
        INNER JOIN [ISG_SOI ].[dbo].[Alerts] AS AllAlerts
        ON Relationship.BNodeCIID = AllAlerts.CIID
--2.
IF OBJECT_ID('tempdb..#Notes') IS NOT NULL 
    DROP TABLE #Notes
SELECT  Notes.AlertID ,
        Notes.AnnotationText ,
        Notes.CreatedBy ,
        Notes.CreatedTime
INTO    #Notes
FROM    [ISG_SOI ].[dbo].[AlertAnnotation] AS Notes
        INNER JOIN [ISG_SOI ].[dbo].[Alerts] AS AllAlerts
        ON Notes.AlertID = AllAlerts.AlertID
--------------------------------------------------------------------------------

SELECT  AllAlerts.AlertID AS AlertID ,
        Queues.QueueID AS QueueID ,
        Queues.QueueName AS QueueName ,
        AllAlerts.ConnectorID AS ConnectorID ,
        CAST(ISNULL(STUFF(( SELECT  CAST(',' AS VARCHAR(MAX))
                                    + [Services].Label
                            FROM    #Services AS [Services]
                            WHERE   [Services].BNodeCIID = AllAlerts.CIID
                          FOR
                            XML PATH('')
                          ), 1, 1, ''), '') AS CHAR(1000)) AS OwnedServices ,
        SUBSTRING(AllAlerts.DeviceID,
                  ISNULL(2 + LEN(AllAlerts.DeviceID)
                         - NULLIF(CHARINDEX(',',
                                            REVERSE(AllAlerts.DeviceID)),
                                  0), 0),
                  CASE CHARINDEX(':', AllAlerts.DeviceID)
                    WHEN 0 THEN LEN(AllAlerts.DeviceID) + 1
                    ELSE CHARINDEX(':', AllAlerts.DeviceID)
                  END - ISNULL(2 + LEN(AllAlerts.DeviceID)
                               - NULLIF(CHARINDEX(',',
                                            REVERSE(AllAlerts.DeviceID)),
                                        0), 0)) AS CIName ,
        AllAlerts.DeviceID AS DeviceID ,
        AllAlerts.SituationMessage AS Summary ,
        AllAlerts.AlertDetail AS Detail ,
        AllAlerts.Acknowledged AS Acknowledged ,
        AllAlerts.UserAttribute5 AS Occurrences ,
        "AcknowledgedBy" = CASE WHEN AllAlerts.Acknowledged = '1'
                                THEN ISNULL(History.CreatedBy,
                                            '')
                                WHEN AllAlerts.Acknowledged = '0'
                                THEN ' '
                           END ,
        AllAlerts.AssignedTo AS AssignedTo ,
        DATEADD(HOUR, DATEDIFF(HH, GETUTCDATE(), GETDATE()),
                AllAlerts.ReportedTime) AS CreatedTime ,
        DATEADD(HOUR, DATEDIFF(HH, GETUTCDATE(), GETDATE()),
                AllAlerts.ClearedTime) AS ClearedTime ,
        "Severity" = CASE WHEN AllAlerts.Severity = '4'
                          THEN 'Down'
                          WHEN AllAlerts.Severity = '3'
                          THEN 'Critical'
                          WHEN AllAlerts.Severity = '2'
                          THEN 'Major'
                          WHEN AllAlerts.Severity = '1'
                          THEN 'Minor'
                     END ,
        AllAlerts.SvcDeskTicket AS TicketID ,
        ISNULL(STUFF(( SELECT   CAST('# ' AS VARCHAR(MAX))
                                + Notes.AnnotationText + '['
                                + Notes.CreatedBy + ', '
                                + CAST(Notes.CreatedTime AS VARCHAR(MAX))
                                + ']'
                       FROM     #Notes AS Notes
                       WHERE    Notes.AlertID = AllAlerts.AlertID
                     FOR
                       XML PATH('')
                     ), 1, 1, ''), '') AS Notes
FROM    [ISG_SOI ].[dbo].[Alerts] AS AllAlerts
        INNER JOIN [ISG_SOI ].[dbo].[AlertQueueAssignments]
        AS QA
        ON QA.[AlertID] = AllAlerts.[AlertID]
        INNER JOIN [ISG_SOI ].[dbo].[AlertQueues] AS Queues
        ON Queues.[QueueID] = QA.[QueueID]
        LEFT JOIN #History AS History
        ON History.AlertID = AllAlerts.AlertID
--try this, variant using CTE

--remove calculation from subquery to cte table
--------------------------------------------------------------------------------
;
WITH    History
          AS ( SELECT   History.AlertID ,
                        MAX(History.CreatedBy) AS CreatedBy
               FROM     [ISG_SOI ].[dbo].[AlertHistory] AS History
                        INNER JOIN [ISG_SOI ].[dbo].[Alerts]
                        AS AllAlerts
                        ON History.AlertID = AllAlerts.AlertID
               WHERE    History.ColumnName = '73549'
                        AND History.Currentvalue = 'true'
               GROUP BY History.AlertID
             ),
-------------------------------------------------------------------------------------
--XML agregation also is too expensive, reduce time thro removing not required data--
-------------------------------------------------------------------------------------
--1.
        [Services]
          AS ( SELECT DISTINCT
                        Relationship.BNodeCIID ,
                        [Services].Label
               FROM     [ISG_SOI ].[dbo].[SecureServiceCI]
                        AS [Services]
                        INNER JOIN [ISG_SOI ].[dbo].[CIRelationship]
                        AS Relationship
                        ON [Services].CIID = Relationship.ServiceCIID
                        INNER JOIN [ISG_SOI ].[dbo].[Alerts]
                        AS AllAlerts
                        ON Relationship.BNodeCIID = AllAlerts.CIID
             ),

--2.
        Notes
          AS ( SELECT   Notes.AlertID ,
                        Notes.AnnotationText ,
                        Notes.CreatedBy ,
                        Notes.CreatedTime
               FROM     [ISG_SOI ].[dbo].[AlertAnnotation]
                        AS Notes
                        INNER JOIN [ISG_SOI ].[dbo].[Alerts]
                        AS AllAlerts
                        ON Notes.AlertID = AllAlerts.AlertID
             )
    --------------------------------------------------------------------------------

SELECT  AllAlerts.AlertID AS AlertID ,
        Queues.QueueID AS QueueID ,
        Queues.QueueName AS QueueName ,
        AllAlerts.ConnectorID AS ConnectorID ,
        CAST(ISNULL(STUFF(( SELECT  CAST(',' AS VARCHAR(MAX))
                                    + [Services].Label
                            FROM    [Services]
                            WHERE   [Services].BNodeCIID = AllAlerts.CIID
                          FOR
                            XML PATH('')
                          ), 1, 1, ''), '') AS CHAR(1000)) AS OwnedServices ,
        SUBSTRING(AllAlerts.DeviceID,
                  ISNULL(2 + LEN(AllAlerts.DeviceID)
                         - NULLIF(CHARINDEX(',',
                                            REVERSE(AllAlerts.DeviceID)),
                                  0), 0),
                  CASE CHARINDEX(':', AllAlerts.DeviceID)
                    WHEN 0 THEN LEN(AllAlerts.DeviceID) + 1
                    ELSE CHARINDEX(':', AllAlerts.DeviceID)
                  END - ISNULL(2 + LEN(AllAlerts.DeviceID)
                               - NULLIF(CHARINDEX(',',
                                            REVERSE(AllAlerts.DeviceID)),
                                        0), 0)) AS CIName ,
        AllAlerts.DeviceID AS DeviceID ,
        AllAlerts.SituationMessage AS Summary ,
        AllAlerts.AlertDetail AS Detail ,
        AllAlerts.Acknowledged AS Acknowledged ,
        AllAlerts.UserAttribute5 AS Occurrences ,
        "AcknowledgedBy" = CASE WHEN AllAlerts.Acknowledged = '1'
                                THEN ISNULL(History.CreatedBy,
                                            '')
                                WHEN AllAlerts.Acknowledged = '0'
                                THEN ' '
                           END ,
        AllAlerts.AssignedTo AS AssignedTo ,
        DATEADD(HOUR, DATEDIFF(HH, GETUTCDATE(), GETDATE()),
                AllAlerts.ReportedTime) AS CreatedTime ,
        DATEADD(HOUR, DATEDIFF(HH, GETUTCDATE(), GETDATE()),
                AllAlerts.ClearedTime) AS ClearedTime ,
        "Severity" = CASE WHEN AllAlerts.Severity = '4'
                          THEN 'Down'
                          WHEN AllAlerts.Severity = '3'
                          THEN 'Critical'
                          WHEN AllAlerts.Severity = '2'
                          THEN 'Major'
                          WHEN AllAlerts.Severity = '1'
                          THEN 'Minor'
                     END ,
        AllAlerts.SvcDeskTicket AS TicketID ,
        ISNULL(STUFF(( SELECT   CAST('# ' AS VARCHAR(MAX))
                                + Notes.AnnotationText + '['
                                + Notes.CreatedBy + ', '
                                + CAST(Notes.CreatedTime AS VARCHAR(MAX))
                                + ']'
                       FROM     Notes
                       WHERE    Notes.AlertID = AllAlerts.AlertID
                     FOR
                       XML PATH('')
                     ), 1, 1, ''), '') AS Notes
FROM    [ISG_SOI ].[dbo].[Alerts] AS AllAlerts
        INNER JOIN [ISG_SOI ].[dbo].[AlertQueueAssignments]
        AS QA
        ON QA.[AlertID] = AllAlerts.[AlertID]
        INNER JOIN [ISG_SOI ].[dbo].[AlertQueues] AS Queues
        ON Queues.[QueueID] = QA.[QueueID]
        LEFT JOIN History
        ON History.AlertID = AllAlerts.AlertID