【问题标题】:What databases have optimization for functions, in order to use indices?为了使用索引,哪些数据库对函数进行了优化?
【发布时间】:2012-04-09 04:42:37
【问题描述】:

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

【问题讨论】:

    标签: database indexing b-tree


    【解决方案1】:

    我知道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
    

    【讨论】:

    • 我的问题是,是否任何 DBMS 都可以使用val 上的索引 不定义基于函数的索引。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 它会在索引值上运行表达式/函数吗?
      • 你能给出一个文档页面的链接吗?
      • 众多 Google 搜索结果中的第一个:sqlteam.com/article/…
      • 再次,这是一个额外的列/索引。
      • 哦,我明白了。我误读了你的问题。当然,如果您在 val 上有一个现有索引,SQL Server 可以做到这一点。我刚刚验证过了。
      猜你喜欢
      • 1970-01-01
      • 2019-07-12
      • 2010-11-19
      • 2011-01-07
      • 1970-01-01
      • 2011-11-23
      • 2012-04-26
      • 2011-08-11
      • 1970-01-01
      相关资源
      最近更新 更多