由于子选择导致的慢查询

Den*_*nis 0 sql t-sql sql-server sql-server-2014

我有几个SQL Server 2014查询,它们回退一个数据集,我们需要计算相关但不同的标准以及该数据.我们使用子查询执行此操作,但这会大大减慢它的速度.到目前为止,我们在数据库中获得更多数据值得信赖.这是查询:

SELECT 
    T.*, 
    ISNULL((SELECT COUNT(1)
            FROM EventRegTix ERT, EventReg ER
            WHERE ER.EventRegID = ERT.EventRegID 
              AND ERT.TicketID = T.TicketID
              AND ER.OrderCompleteFlag = 1), 0) AS NumTicketsSold
FROM 
    Tickets T 
WHERE 
    T.EventID = 12345
    AND T.DeleteFlag = 0 
    AND T.ActiveFlag = 1
ORDER BY 
    T.OrderNumber ASC
Run Code Online (Sandbox Code Playgroud)

我很确定它主要是由于在子查询之外的关系到Tickets表.如果我将其更改T.TicketID为实际票证#(例如999),则查询速度会快很多.

我试图将这些查询合并为一个,但由于子查询中还有其他字段,我无法让它正常工作.我在玩弄

COUNT(1) OVER (PARTITION BY T.TicketID) AS NumTicketsSold
Run Code Online (Sandbox Code Playgroud)

但也无法解决这个问题.

任何帮助将非常感激!

Gor*_*off 5

我会这样写:

SELECT T.*, 
       (SELECT COUNT(1)
        FROM EventRegTix ERT JOIN
             EventReg ER
             ON ER.EventRegID = ERT.EventRegID 
        WHERE ERT.TicketID = T.TicketID AND ER.OrderCompleteFlag = 1
      ) AS NumTicketsSold
FROM Tickets T 
WHERE T.EventID = 12345 AND
      T.DeleteFlag = 0 AND
      T.ActiveFlag = 1
ORDER BY T.OrderNumber ASC;
Run Code Online (Sandbox Code Playgroud)

适当的,明确的标准 JOIN语法不会提高性能; 它只是正确的语法.COUNT(*)不能返回NULL值,因此COALESCE()或类似的功能是不必要的.

你需要索引.最明显的有上Tickets(EventID, DeleteFlag, ActiveFlag, OrderNumber),EventRegTix(TicketID, EventRegID)EventReg(EventRegID, OrderCompleteFlag).