2012-03-25 17 views
1

想,我有一個浮動欄和AA B樹索引和一百萬行:什麼數據庫對函數進行了優化,以便使用索引?

CREATE TABLE test (
    val FLOAT, 
    KEY (val) 
); 

INSERT INTO test VALUES (random(-1000, 1000)), (random(-1000, 1000)), ... 

(1M行)

現在,如果我要做出這樣

SELECT * FROM test WHERE abs(val) > param 
查詢

SELECT * FROM test WHERE int(val) % 2; /* odd integer numbers only */ 

什麼數據庫可以優化這種使用指數val,這樣我就不必在我檢查的表達式上使用索引,或者我自己可以反轉表達式?

回答

0

我不認爲如果你在一個函數或表達式中使用該列任何DBMS可以使用val一個「普通」指標。

主要原因是應用該函數的結果可能會使索引查詢非常昂貴(基本上根據表達式「on the fly」創建索引),或者在最壞情況下明顯錯誤索引查找「普通」值返回的是完全不同於表達式結果的索引查找(這很可能發生)。

0

我知道postgres可以做到。請參見documentation,但您可以在表達式上創建索引。

使用你的例子:

CREATE INDEX ON test(abs(val)); -- function calls don't require surrounding brackets 
CREATE INDEX ON test((int(val) % 2)); -- arbitrary expressions require surrounding brackets 
+1

我雖然問題是如果任何DBMS可以使用'val' **索引沒有**定義基於函數的索引。 – 2012-03-25 13:34:35

0

SQL Server可以做到這一點。它只會工作,因爲優化器會將查詢中的表達式與索引匹配。

+0

它會在索引值上運行表達式/函數嗎? – 2012-03-25 14:10:28

+0

是的。它和其他任何持久列一樣。 – usr 2012-03-25 14:11:41

+0

你能給這個文檔頁面的鏈接嗎? – 2012-03-25 14:27:51

相關問題