假设我有一个浮点列和一个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 :(得分: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可以做到这一点。它将起作用,因为优化器会将查询中的表达式与索引匹配。