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

Database 为了使用索引,哪些数据库对函数进行了优化?,database,indexing,b-tree,Database,Indexing,B Tree,假设我有一个float列、一个b树索引和一百万行: CREATE TABLE test ( val FLOAT, KEY (val) ); INSERT INTO test VALUES (random(-1000, 1000)), (random(-1000, 1000)), ... (1米行) 现在,如果我想做一个如下的查询 SELECT * FROM test WHERE abs(val) > param 或 什么数据库可以优化它以使用val上的索引,这样我

假设我有一个float列、一个b树索引和一百万行:

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

INSERT INTO test VALUES (random(-1000, 1000)), (random(-1000, 1000)), ...
(1米行)

现在,如果我想做一个如下的查询

SELECT * FROM test WHERE abs(val) > param

什么数据库可以优化它以使用
val
上的索引,这样我就不必在我检查的表达式上使用索引,也不必自己反向使用表达式?

我知道可以做到这一点。请参见,但要在表达式上创建索引

使用您的示例:

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

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


主要原因是,应用该函数的结果可能使索引查找在最好的情况下非常昂贵(基本上是基于表达式“on-The-fly”创建索引),或者在最坏的情况下使“plain”的索引查找完全错误值返回的行与表达式结果的索引查找完全不同(很可能发生这种情况)。

SQL Server可以执行此操作。因为优化器会将查询中的表达式与索引相匹配,所以它会起作用。

I认为问题是,是否有数据库管理系统可以在
val
上使用索引,而无需定义基于函数的索引。它会在索引值上运行表达式/函数吗?你能提供一个指向此文档页面的链接吗?这是许多Google中的第一个结果:再一次,这是一个额外的列/索引。哦,我明白了。我误解了你的问题。当然,如果您在val上有一个现有索引,SQL Server可以做到这一点。我刚刚验证了这一点。
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