【发布时间】:2012-03-22 14:17:19
【问题描述】:
我有一张这样的桌子
表 1:
col1
col2
col3
并且在 col3 上有一个索引。 如果我使用以下查询从表中选择数据。
SELECT * FROM Table1 WHERE LCASE(col3) ='abcde'
索引是否有助于提高性能?
【问题讨论】:
标签: sql performance indexing db2
我有一张这样的桌子
表 1:
col1
col2
col3
并且在 col3 上有一个索引。 如果我使用以下查询从表中选择数据。
SELECT * FROM Table1 WHERE LCASE(col3) ='abcde'
索引是否有助于提高性能?
【问题讨论】:
标签: sql performance indexing db2
现在,Db2 终于支持基于表达式的索引 AKA 基于函数的索引,在 DB2 10.5+ 中可用
现在你可以创建一个类似的索引
CREATE INDEX col3_lcase_idx on Table1 ( LCASE(col3) )
RUNSTATS ON TABLE Table1 AND INDEXES ALL
【讨论】:
简短回答:不。
长答案:不。
想象一下 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 索引。
【讨论】:
lower_col3的持久计算字段)
ABC 的记录,并使用= 'abc' 搜索它并查看结果。我不知道 DB2 等价物是什么,但您可以拥有区分大小写或不区分大小写的 归类序列。但是如果你将一个字段包装在一个函数中,就会严重损害使用索引的能力。