2013-03-14 101 views
0

此SQL查詢是否創建臨時表?

SELECT * 
FROM (
     (SELECT table1.id1, table1.id1_type AS id1, 
     FROM child AS table2 STRAIGHT_JOIN parent AS table1 ON table1.id1=table2.id1 
     AND table1.id2=table2.id2 
     AND table1.time=table2.time 
     WHERE table1.id1=123456 
      AND ((table1.time>=0 
       AND table1.time<=1361936895))) 
     UNION ALL 
     (SELECT table1.id1 AS id1, table1.id1_type 
     FROM child AS table2 STRAIGHT_JOIN step_parent AS table1 ON table1.id1=table2.id1 
     AND table1.id2=table2.id2 
     AND table1.time=table2.time 
     WHERE table1.id1=123456 
       AND table1.time<=1361936895)))) AS T 
WHERE id1_type NOT IN (15) 
ORDER BY time DESC LIMIT 2000

我正在使用下面的sql查詢(兩個連接,一個union all),我看到裏面增加了連接後大量增加了延遲。我可以看到存儲空間的使用情況在我的機器上出現,我想知道是否因爲我正在創建臨時表?

作爲附加上下文,當我添加連接時,我還添加了'table1','table2'別名,以便在選擇列時避免模糊性,我開始看到這些空間使用率增加。

爲什麼這另外,或查詢作爲一個整體,是造成這些查詢巨大的存儲秒殺任何建議,將不勝感激:)

+1

什麼數據庫引擎? – 2013-03-14 04:16:19

+0

'STRAIGHT_JOIN'暗示MySQL – msmucker0527 2013-03-14 17:21:06

回答

2

它是由數據庫引擎來決定它認爲是最好的策略來完成您的查詢。後臺臨時表肯定是它的一個選擇。

表別名確實不應該與它有任何關係,右列是無論您使用它的標籤的右列。

出於興趣,您是否嘗試使用連接而不是straight_join?您通過指定straight_join來限制查詢優化器的選項。

+0

我使用的是straight_join,因爲我知道孩子的行將成爲parent和foster_parent的子集。我很高興知道別名不會導致臨時表的使用。 – sparkFinder 2013-03-14 04:28:35

+0

我主要是一個SQL Server的傢伙,所以straight_join不是我真正熟悉的東西,但是從我閱讀的內容來看,我想知道是否你有它背對背。是不是需要對子表進行全表掃描,然後查看父行或step_parent上的條件是否匹配每行?嘗試使用常規連接或在straight_joins中顛倒表格順序,並查看會發生什麼。 – MattW 2013-03-14 04:38:32

+0

這是正確的 - 子表的行數更少,我正在加入父母的主鍵索引(在問題中未提及) - 就我理解而言,這會減少要經過的行數。 – sparkFinder 2013-03-14 05:12:35