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)
但也无法解决这个问题.
任何帮助将非常感激!
我会这样写:
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).