Database 为了使用索引,哪些数据库对函数进行了优化?
假设我有一个float列、一个b树索引和一百万行: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上的索引,这样我
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