2017-03-03 13 views
0

UNIONALL需要更多時間,下面是查詢的示例。如下表T1所示,只有4條記錄,但在我的查詢中,T1有近150萬條記錄。 有什麼辦法可以調整下面的查詢方式,而不是使用unionall我們可以使用任何條件。謝謝!UNIONALL性能

CREATE TABLE T1 (ID INT, FROM_KEY INT,TO_KEY INT, IS_STATUS BIT) 

INSERT INTO T1 VALUES(1, 50001,50002, 1) 
INSERT INTO T1 VALUES(2, 50003,50004, 1) 
INSERT INTO T1 VALUES(3, 50005,50006, 1) 
INSERT INTO T1 VALUES(4, 50007,50008, 1) 

DECLARE @KEY INT = 50002 

SELECT TO_KEY FROM T1 WHERE [email protected] AND IS_STATUS=1 
UNION ALL 
SELECT FROM_KEY FROM T1 WHERE [email protected] AND IS_STATUS=1 
+0

你有'to_key,is_status'和'from_key,is_status'上的索引嗎?條件中選擇了150萬行中的多少行? –

+0

@Suraz他的意思是說,他在上述例子中只有4條記錄。實際生產數據包含150萬條記錄。 –

回答

0

單通道查詢可能更理想:

SELECT CASE WHEN N=0 THEN FROM_KEY ELSE TO_KEY END 
FROM (SELECT * FROM T1 WHERE @KEY in (TO_KEY, FROM_KEY) AND IS_STATUS=1) AS A 
    JOIN (SELECT 0 N UNION ALL SELECT 1) AS B 
     ON (N=0 AND [email protected]) OR (N=1 AND [email protected]) 

但在一般情況下,如果你希望得到的幫助優化查詢,你必須提供有關SQL Server的品牌,版本更多的信息,數據大小,索引等。

+0

我能夠返回相同的結果,作爲perf的一部分,差異是略微的,我的意思是發現性能與原始版本非常相似。 – user7399003

+0

正如我所說,鑑於信息太小,不能提出更有效的解決方案 – Sergey

1

可以簡化爲:

SELECT @KEY 
FROM T1 
WHERE @KEY IN (TO_KEY, FROM_KEY) 
    AND IS_STATUS = 1 

(僅返回同一行一次如果兩個TO_KEY和from_key相等的同時,以@key,而UNION ALL查詢將返回該行的兩倍。 )