2013-04-08 66 views
0

我使用H2 SELECT DISTINCT緩慢,有一個簡單的查詢,看起來像這樣:H2:儘管低選擇性

SELECT DISTINCT col 
FROM PUBLIC.TABLE; 

H2採用了全表掃描,即使選擇性低,且有col上的非唯一索引。

我檢查這個就跑:

SELECT SELECTIVITY(CLUSTERNODE) FROM PUBLIC.TRANSFORMATION; 

哪個返回 '1'。

任何想法?

+0

是索引*僅*在所需的列上,還是包含其他列?表中有多少行?統計表最近更新了多久?這是同樣的問題http://stackoverflow.com/questions/15883629? – 2013-04-08 17:32:43

+0

我不知道「分析」,一旦我執行它,一切都很好,謝謝!如果您添加答案,我會將其標記爲正確。我剛剛升級到H2的最新版本,它似乎會自動更新表統計信息,對不對?不幸的是,另一個問題沒有解決。 – 2013-04-08 18:11:33

+0

你應該能夠爲自己的問題提供答案,並在一段時間後接受它們 - 因爲我不確切知道你是如何解決問題的,所以我認爲你會比我更好地回答這個問題。 – 2013-04-08 18:14:57

回答

2

儘管選擇性較低(=基數),但在DISTINCT查詢中H2仍不能使用現有索引的原因在於它在內部維護表格統計信息,這些表格統計信息用於確定列選擇性,並且可能會過時,或者根本沒有初始化。

該文檔說,在較新的版本中,這些更新自動,但它似乎需要一定量的INSERT(或其他突變),至少在我的情況下,升級本身並沒有伎倆(我升級從1.2.143到1.3.171)。

只需執行「分析」更新查詢,一切都應該沒問題。就我而言,執行時間從近一分鐘下降到300毫秒。