2013-05-01 29 views
1

我必須有一些SQL查詢每一天,它通常涉及加入 我想知道這是最正確的方式做,例如在該表聯接SQL優化加入

A("a",x,y) 
B("b",'a',z,w) 

哪裏a和b是主鍵,
哪個更好?

SELECT * 
FROM a,b 
WHERE a.a=b.a AND a.x<constant 

SELECT * 
FROM (SELECT * FROM a WHERE x < constant) t, b 
WHERE t.a=b.a 

這意味着,最好使第一where子句和地方

感謝你使後加入或者我可以做的加入和過濾後!

+1

這兩個查詢都是交叉連接。我會說「更好」取決於你之後的數據類型,這是你不能解釋的。 – Makoto 2013-05-01 04:53:23

+1

檢查您的查詢執行計劃。我敢打賭,他們的處理方式與我相同 – 2013-05-01 05:26:48

回答

2

你的第一種方法是更好的方法。第二種方法是使用子查詢並在查詢中使用子查詢會降低性能。因爲在第二種方法中,查詢必須首先獲取表中的所有行,然後根據連接條件對其進行過濾,但在第一種方法中,查詢只會獲取匹配總是更快的連接條件的行。希望我所做的儘可能簡單......!

+0

我不同意,因爲我們假設數據的大小(如果數據的大小相對較小,那麼對性能的影響應該不會有明顯的影響),以及被問到的問題 - 如果他們要追蹤其他數據,那麼使用其他類型的連接可能更有效。 – Makoto 2013-05-01 05:02:56

+0

是的,我對數據的大小做了一個假設。我假定兩張表中的數據都很大,如果不是很大的話。但即使數據量在數千人之中,我的感覺仍然很好。如果我錯了,請糾正我。 – Abhi 2013-05-01 05:11:30

+0

@Abhi你說得很對。連接總是更快。 – 2013-05-01 05:26:33

0

智能優化器(如Oracle的)會以同樣的方式執行他們兩個:

如果SELECT * FROM a WHERE x < constant結果是比較小:

Nested loop join

否則:

Hash join

0

首先寫清代碼,儘可能乾淨清晰e,針對特定的問題,而不是微觀管理優化器。在過去的一週中,我使用了這兩種查詢風格。無論您今天測試的數據量如何,我都可以保證您明年的數據量將更多。

您將始終需要調整生產速度較慢的查詢,但要猜測哪些查詢是杯子遊戲。這個時間比猜測哪個查詢可能成爲問題要花費得多,並且事先優化所有這些查詢。