2014-09-30 44 views
5

以下查詢的執行速度顯着不同。第二個比第一個快幾個數量級。HSQLDB中的SQL INNER JOIN自動優化

SELECT * FROM A INNER JOIN B ON A.X=B.Y WHERE B.Z=1 
SELECT * FROM A INNER JOIN (SELECT * FROM B) ON A.X=B.Y WHERE B.Z=1 

如果有人會寫這是爲什麼,這將是偉大的。 該數據庫是HSQLDBJDBC

附加信息:版本HSQLDB是2.3.2。列A.X被索引,但列B.Y不是。

+1

你可以測試第三個版本:'選擇*從內部連接B上A.X = B.Y和B.Z = 1'? – 2014-09-30 14:24:40

+0

@JoëlSalamin這與第一個緩慢版本的執行時間差不多。 – user3726374 2014-09-30 14:28:36

+0

這可能是由於'B.Y'沒有編入索引。你可以試試這個其他版本,並告訴我是否有性能增益/損失:'SELECT * FROM A IN JOIN(SELECT * FROM B WHERE BZ = 1)ON AX = BY' – 2014-09-30 15:32:14

回答

1

答案是:indexing

想象一下,我有一本字典,有人給了我一個任務,找到5000個字在裏面。這項任務需要幾個小時。
但現在想象一下,這本詞典是未排序的。要花幾年時間才能找到所有這些詞彙。
計算機速度更快,對於第一個任務只需要幾毫秒,而第二個任務只需幾秒鐘。

爲什麼第一個查詢很慢?

這是因爲有INNER JOIN,它是在未編制索引的列上完成的。

爲什麼第二個查詢如此之快?

這是因爲存在子查詢。此子查詢已物化爲臨時表,併爲連接列創建索引。所以你現在沒有加入未索引的B表,而是使用索引臨時表。 HSQLDB在臨時表上創建此索引以使其更容易聯接。即使您將連接條件更改爲更復雜(例如:A.X = B.Y + 2*B.Z),該查詢仍然會很快。這意味着HSQLDB在連接條件中使用的表達式創建索引。

+0

這絕對有道理。你可能對你所描述的有什麼參考? – user3726374 2015-01-15 10:20:37