2014-02-12 6 views
2

EDIT:Могу ли я сделать этот поиск T-SQL лучше?

Благодаря ответам, я дополнительно очищен код на следующее:

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, 
    right(AllAlerts.DeviceID, len(AllAlerts.DeviceID)-charindex(',', AllAlerts.DeviceID)) as CIName, 
    AllAlerts.DeviceID as DeviceID, 
    AllAlerts.SituationMessage as Summary, 
    AllAlerts.AlertDetail as Detail, 
    AllAlerts.Acknowledged as Acknowledged, 
    AllAlerts.AssignedTo as AssignedTo, 
    AllAlerts.ReportedTime as CreatedTime, 
    AllAlerts.ClearedTime as ClearedTime, 
    AllAlerts.Severity as Severity, 
    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] 

where Queues.QueueName = 'OCC' 

- ОРИГИНАЛЬНЫЙ ПОСТ -

Я работал на T-SQL найдите проект, над которым я работаю на работе, и, наконец, получили параметры поиска, чтобы вернуть все результаты, которые мне нужны. Мне было любопытно, есть ли способ улучшить эту команду? Вам придется простить меня, поскольку я не эксперт по SQL.

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 
             WHERE Services.CIID IN (
              SELECT Relationship.ServiceCIID 
               FROM [ISG_SOI ].[dbo].[CIRelationship] AS Relationship 
               WHERE Relationship.BNodeCIID = AllAlerts.CIID)) AS Services 
          FOR 
          XML PATH('')), 1, 1, ''), '') AS CHAR(1000)) AS OwnedServices 
     ,RIGHT(AllAlerts.DeviceID, LEN(AllAlerts.DeviceID) - CHARINDEX(',', AllAlerts.DeviceID)) AS CIName 
     ,AllAlerts.DeviceID AS DeviceID 
     ,AllAlerts.SituationMessage AS Summary 
     ,AllAlerts.AlertDetail AS Detail 
     ,AllAlerts.Acknowledged AS Acknowledged 
     ,AllAlerts.AssignedTo AS AssignedTo 
     ,AllAlerts.ReportedTime AS CreatedTime 
     ,AllAlerts.ClearedTime AS ClearedTime 
     ,AllAlerts.Severity AS Severity 
     ,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 
     ,[ISG_SOI ].[dbo].[AlertQueues] AS Queues 

WHERE AllAlerts.AlertID IN (SELECT QueueAssignment.AlertID 
            FROM [ISG_SOI ].[dbo].[AlertQueueAssignments] AS QueueAssignment 
            WHERE QueueAssignment.QueueID IN (SELECT Queues.QueueID 
                     WHERE Queues.QueueName = 'OCC')) 
+0

Я удалил тег MySQL, потому что это явно о SQL Server. –

+0

Вам не задан последний оператор 'FROM'. –

+0

Почти гарантировано, что это можно было бы переписать лучше. Вы используете подзапросы как сумасшедшие, хотя кажется, что по крайней мере предложение where может быть легко переписано с помощью простого внутреннего соединения, что должно значительно повысить производительность. Как правило, подзапросы стоят дорого, вы почти всегда хотите заменить их на объединения, если это возможно. – Luaan

ответ

0

Чтобы проиллюстрировать частичное решение, основанное на мой комментарий:

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

where Queues.QueueName = 'OCC' 

Вместо три вложенных подзапросы, вы остались только один.

Такое же улучшение можно сделать в первом подзапросе for xml - снова вы делаете что-то, что делается для использования подзапросов.

+0

Спасибо за это, я действительно изучил некоторый синтаксис из этого комментария. Хотелось бы, чтобы я мог подняться, но у меня пока нет репутации :( –

+0

@ paimon.soror Вы должны быть в состоянии отметить мой ответ как правильный, если я не ошибаюсь :) – Luaan

+0

сделано, еще раз спасибо за помощь, был опытом обучения. –

0

Вы используете много вложенных сортирует, которые медленно, потому что вы можете оценить ВЫБИРАЕТ для каждой строки верхнего уровня. Скорее используйте Common Table Expressions (CTE), которые позволят вам выполнить предварительный просмотр SELECT.

WITH MyCTE AS (

SELECT distinct Services.Label 
      from [ISG_SOI ].[dbo].[SecureServiceCI] as Services 
      where Services.CIID in (
       select Relationship.ServiceCIID 
       from [ISG_SOI ].[dbo].[CIRelationship] as Relationship 
       where Relationship.BNodeCIID = AllAlerts.CIID 
) 
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 (
      MyCTE 
     ) as Services 

Вы можете определить несколько КТР для каждого из вложенных запросов

+0

Это хорошо, мне нужно будет немного почитать о том, как использовать CTE для лучшего понимания. Спасибо, что нашли время! –

+0

Итак, я сделал некоторое чтение, и похоже, что проблема заключается в том, что внутри моего внутреннего выбора я использую «AllAlerts.CIID». Если бы я переместил выделение в CTE, у него не было бы ссылки на «AllAlerts», поскольку это часть основного запроса. Если есть способ передать параметры в CTE, но я не считаю, что это возможно. –

0

Спасибо всем за помощь! Вот окончательный результат кода, основанный на вводе комментариев!

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, 
    right(AllAlerts.DeviceID, len(AllAlerts.DeviceID)-charindex(',', AllAlerts.DeviceID)) as CIName, 
    AllAlerts.DeviceID as DeviceID, 
    AllAlerts.SituationMessage as Summary, 
    AllAlerts.AlertDetail as Detail, 
    AllAlerts.Acknowledged as Acknowledged, 
    AllAlerts.AssignedTo as AssignedTo, 
    AllAlerts.ReportedTime as CreatedTime, 
    AllAlerts.ClearedTime as ClearedTime, 
    AllAlerts.Severity as Severity, 
    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] 

where Queues.QueueName = 'OCC' 
Смежные вопросы