繁体   English   中英

数据库案例不敏感指数?

[英]Database Case Insensitive Index?

我有一个查询,我在搜索字符串:

SELECT county FROM city WHERE UPPER(name) = 'SAN FRANCISCO';

现在,这工作正常,但它不能很好地扩展,我需要优化它。 找到了一个创建生成视图的选项 ,或类似的东西,但我希望使用索引的更简单的解决方案。

我们正在使用DB2,我真的想在索引中使用表达式 ,但是这个选项似乎只能在z / OS上使用,但我们运行的是Linux。 我还是尝试了表达式索引:

CREATE INDEX city_upper_name_idx
ON city UPPER(name) ALLOW REVERSE SCANS;

但当然,它在UPPER(名称)上窒息。

我是否有另一种方法可以以这种方式创建索引或类似的东西,这样我就不必重构我现有的查询以使用新生成的视图,或者更改我现有的列,或任何其他此类侵入式更改?

编辑:我愿意听取其他数据库的解决方案......它可能会延续到DB2 ......

您可以添加一个包含城市名称的数字哈希键的索引列。 (允许重复)。

然后你可以做一个多子句,其中:

hash = [compute hash key for 'SAN FRANCISCO']

SELECT county 
FROM city 
WHERE cityHash = hash 
  AND UPPER(name) = 'SAN FRANCISCO' ;

或者,浏览db手册并查看创建表索引的选项。 可能会有所帮助。

简短的回答,没有。

答案很长,是的,如果你在大型机上运行,​​但你不是,所以你必须使用其他技巧。

DB2(从DB2 / LUW v8开始)现在已经生成了列,因此您可以:

CREATE TABLE tbl (
    lname  VARCHAR(20),
    fname  VARCHAR(20),
    ulname VARCHAR(20) GENERATED ALWAYS AS UPPER(lname)
);

然后在ulname上创建一个索引。 我不确定你会比这简单得多。

在此之前,您曾经必须使用插入和更新触发器的组合来确保ulname列保持同步,这是一个难以维护的噩梦。 此外,既然此功能是核心DBMS的一部分,它已经过高度优化(它比基于触发器的解决方案快得多)并且不会妨碍真实用户触发器,因此不需要维护额外的DB对象。

详情请见此处

Oracle支持基于函数的索引。 他们的典型例子:

 create index emp_upper_idx on emp(upper(ename));  

PostgreSQL还支持索引函数的结果:

CREATE INDEX mytable_lower_col1_idx ON mytable (lower(col1));

我能想到的唯一另一个选择是通过创建另一个列来保持大写版本(由触发器更新)并对其进行索引来对数据进行一些标准化。 布莱什!

我不知道这是否适用于DB2,但我会告诉你我是如何在SQL Server中这样做的。 认为 MSSQL这样做的方式是ANSI标准,尽管特定的排序字符串可能不同。 无论如何,如果你可以做到这一点而不会破坏你的应用程序的其余部分 - 还有其他地方,“名称”列需要区分大小写吗? - 尝试通过更改排序规则使整个列不区分大小写,然后索引列。

ALTER TABLE city ALTER COLUMN name nvarchar(200) 
    COLLATE SQL_Latin1_General_CP1_CI_AS

...其中“nvarchar(200)”代表您当前的列数据类型。 归类字符串的“CI”部分标记为在MSSQL中不区分大小写。

要解释......我的理解是索引将按索引列的排序规则的顺序存储值。 使列的排序规则不区分大小写将使索引存储“旧金山”,“旧金山”和“旧金山”全部合并在一起。 然后你应该只需从查询中删除“UPPER()”,DB2应该知道它可以使用你的索引。

同样,这完全基于我对SQL Server的了解,加上几分钟的SQL-92规范; 它可能适用于DB2,也可能不适用于DB2。

DB2在整理方面并不强大。 它没有基于功能的索引。

Niek Sanders的建议是有效的,如果你能接受哈希必须在你的应用程序中发生(因为DB2没有SHA或MD5函数,据我所知)。

但是,如果我是你,我将使用CREATE TABLE AS创建一个物化视图(MQT ==物化查询表,使用db2用语),添加一个列,其中包含名称的预先计算的大写变体。 注意:您可以在DB2中向实现视图添加索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM