【发布时间】:2016-01-14 09:41:46
【问题描述】:
我有一个查询,它使用包含不同 WHERE 子句的多个 SELECT 语句来返回多个列,这些列获取不同类别的订单计数。我目前正在使用 cte 来尝试优化它,但它仍然运行得很慢。我认为临时表可能是一个更快的解决方案,但我无法到达那里:
查询:
DECLARE @User AS VARCHAR(50)
SET @User = 'test.user';
WITH cte AS (
SELECT
o.db_OrderNo,
o.db_Deferral,
d.db_SeqNo,
d.db_Task
FROM
tblOrders o
LEFT JOIN tblDate d on d.db_SeqNo = o.db_Status
LEFT JOIN tblUserProfile up on up.db_UserId = o.db_RTS
WHERE
o.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task IN (1, 2, 3, 4)
AND up.db_Email LIKE @User + '%'
)
SELECT
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task = 1
AND db_Deferral = 0) OrderInEvalCount,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task = 2
AND db_Deferral = 0) OrderInDfcCount,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task IN (3, 4)
AND db_SeqNo NOT IN (37, 39)
AND db_Deferral = 0) OrderWipCount,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Deferral != 0) OrderInPendedCount
输出:
OrderInEvalCount | OrderInDfcCount | OrderWipCount | OrderInPendedCount
20 34 9 2
临时表:
CREATE TABLE #TempCounts ( OrderInEvalCount int, OrderInDfcCount int, OrderWipCount int, OrderInzPendedCount int);
// First column
SELECT COUNT(DISTINCT db_OrderNo)
INTO //Not sure how to specify a column
FROM tblOrders o
WHERE db_Task = 1
AND db_Deferral = 0
AND o.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND up.db_Email LIKE @User + '%'
我以前没有使用过 TEMP 表,所以这个开始可能有点偏离。您认为可以加快当前查询的任何其他解决方案将不胜感激。谢谢
【问题讨论】:
标签: sql sql-server performance sql-server-2008 temp-tables