Mik*_*one 6 sql database oracle db2 indexing
我有一个查询,我在搜索字符串:
SELECT county FROM city WHERE UPPER(name) = 'SAN FRANCISCO';
Run Code Online (Sandbox Code Playgroud)
现在,这工作正常,但它不能很好地扩展,我需要优化它.我找到了一个创建生成视图的选项,或类似的东西,但我希望使用索引的更简单的解决方案.
我们正在使用DB2,我真的想在索引中使用表达式,但是这个选项似乎只能在z/OS上使用,但我们运行的是Linux.我还是尝试了表达式索引:
CREATE INDEX city_upper_name_idx
ON city UPPER(name) ALLOW REVERSE SCANS;
Run Code Online (Sandbox Code Playgroud)
但当然,它在UPPER(名称)上窒息.
是否有另一种方法可以以这种方式创建索引或类似的东西,这样我就不必重新构建现有的查询以使用新生成的视图,或者更改现有列,或任何其他此类侵入式更改?
编辑:我愿意听取其他数据库的解决方案......它可能会延续到DB2 ......
您可以添加一个包含城市名称的数字哈希键的索引列.(允许重复).
然后你可以做一个多子句,其中:
hash = [compute hash key for 'SAN FRANCISCO']
SELECT county
FROM city
WHERE cityHash = hash
AND UPPER(name) = 'SAN FRANCISCO' ;
Run Code Online (Sandbox Code Playgroud)
或者,浏览db手册并查看创建表索引的选项.可能会有所帮助.
简短的回答,没有.
答案很长,是的,如果你在大型机上运行,但你不是,所以你必须使用其他技巧.
DB2(从DB2/LUW v8开始)现在已经生成了列,因此您可以:
CREATE TABLE tbl (
lname VARCHAR(20),
fname VARCHAR(20),
ulname VARCHAR(20) GENERATED ALWAYS AS UPPER(lname)
);
Run Code Online (Sandbox Code Playgroud)
然后在ulname上创建一个索引.我不确定你会比这简单得多.
在此之前,您曾经必须使用插入和更新触发器的组合来确保ulname列保持同步,这是一个难以维护的噩梦.此外,既然此功能是核心DBMS的一部分,它已经过高度优化(它比基于触发器的解决方案快得多)并且不会妨碍真实用户触发器,因此不需要维护额外的DB对象.
详情请见此处.