【问题标题】:How does DB2 react without the functional based Index如果没有基于函数的索引,DB2 会如何反应
【发布时间】:2012-03-22 14:17:19
【问题描述】:

我有一张这样的桌子

表 1:

col1
col2
col3

并且在 col3 上有一个索引。 如果我使用以下查询从表中选择数据。

SELECT * FROM Table1 WHERE LCASE(col3) ='abcde'

索引是否有助于提高性能?

【问题讨论】:

    标签: sql performance indexing db2


    【解决方案1】:

    现在,Db2 终于支持基于表达式的索引 AKA 基于函数的索引,在 DB2 10.5+ 中可用

    https://www.ibm.com/developerworks/community/blogs/DB2PLSQL/entry/db2_expression_based_indexes?lang=en

    现在你可以创建一个类似的索引

    CREATE INDEX col3_lcase_idx  on Table1 ( LCASE(col3) )
    RUNSTATS ON TABLE Table1 AND INDEXES ALL
    

    【讨论】:

      【解决方案2】:

      简短回答:不。

      长答案:不。

      想象一下 col3 中的以下内容:

      Foo
      bar
      baz
      foo
      BAR
      

      col3 上的索引会知道这个顺序:

      BAR
      Foo
      bar
      baz
      foo
      

      但是,查询 lcase(col3) 的顺序是

      bar
      BAR
      baz
      foo
      Foo
      

      与索引完全不同,所以索引的用处有限。

      但是,您可以在表格中添加一个自动创建的小写字段:

      ALTER TABLE Table1
            ADD COLUMN col3_lcase VARCHAR(?) 
                GENERATED ALWAYS AS ( LCASE(col3) );
      CREATE INDEX col3_lcase_idx ON Table1 ( col3_lcase );
      

      然后上面的选择将使用col3_lcase_idx 索引。

      【讨论】:

      • 这不是完全正确的。它从索引搜索变为索引扫描;你描述的是表扫描。这在 col3 不是唯一的情况下是相关的。它可以扫描所有索引条目,而不是扫描所有行,每个索引条目可能覆盖多行。所以它仍然是一个扫描,这很糟糕,但是拥有索引可以有部分好处。 (如果可能的话,最好避免这样做。例如有一个名为lower_col3的持久计算字段)
      • @beny23 但它必须是一种不区分大小写的搜索方式。我以为 DB2 会自动提供它
      • @Kayser - 创建一个值为ABC 的记录,并使用= 'abc' 搜索它并查看结果。我不知道 DB2 等价物是什么,但您可以拥有区分大小写或不区分大小写的 归类序列。但是如果你将一个字段包装在一个函数中,就会严重损害使用索引的能力。
      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多