哪些数据库对函数进行了优化,以便使用索引?

时间:2012-03-25 09:49:06

标签: database indexing b-tree

假设我有一个浮点列和一个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上的索引,这样我就不必在我检查的表达式上使用索引,或者自己反向表达式?

3 个答案:

答案 0 :(得分: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 :(得分:0)

如果您在函数或表达式中使用该列,我认为任何DBMS都不能在val上使用“普通”索引。

主要原因是应用函数的结果可能使索引查找充其量非常昂贵(基本上是基于“动态”表达式创建索引)或者在最坏的情况下使用索引查找时出现明显错误对于“plain”值,返回一个完全不同的行,而不是对表达式结果的索引查找(很可能发生)。

答案 2 :(得分:0)

SQL Server可以做到这一点。它将起作用,因为优化器会将查询中的表达式与索引匹配。