2012-03-25 16 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

相关问题