用DB2 pureXML执行不区分大小写的高效搜索(二)

 
   | |

导读:本文主要介绍用DB2 pureXML执行不区分大小写的高效搜索的方法。以不区分大小写的方式搜索DB 2数据有多种方法,比如使用生成的列.尽管这些方法都适合关系数据……

关键词:DB2 pureXML DB2搜索 不区分大小写搜索 查询XML数据

正在加载数据...

如果只查询少量数据,或者查询还包含其他选择性谓词,使得大写谓词只应用于很小的中间结果集,那么这种方式效果还不错。问题是如果使用包含fn:upper-case() 函数的谓词,就不会使用DB2中的XML索引。因此,这种方式不适用于大量数据。

要想避免使用fn:upper-case()函数并利用 XML 索引加快查询,就需要创建不区分大小写的数据库。

创建不区分大小写的DB2数据库

DB2 从 Version 9.5 Fixpack 1 开始支持感知地区的 Unicode 排序规则。这使我们能够忽略大小写和/或重音符号。要想创建对于所有字符串比较不区分大小写的数据库,需要使用排序规则 UCA500R1,见 清单 4。

清单 4. 创建不区分大小写的数据库 


 CREATE DATABASE testdbUSING CODESET UTF-8 TERRITORY USCOLLATE USING UCA500R1_LEN_S2;  

字符串 UCA500R1_LEN_S2 究竟意味着什么?UCA500R1 指定此数据库使用基于 Unicode 5.0.0 标准的默认 Unicode Collation Algorithm(UCA)。因为默认的 UCA 不能同时覆盖 Unicode 支持的每种语言的排序规则序列,所以可以使用可选属性定制字符的次序。属性以下划线(_)分隔。UCA500R1 关键字加上所有属性构成一个 UCA 排序规则名。

清单 4 中使用的排序规则名包含两个属性:LEN 和 S2。LEN 是 L(语言)和 EN(英语的 ISO 639-1 语言编码)的组合。第二个属性 S2 指定强度级别,这决定在字符串排序或比较时是否考虑大小写或重音符号。在 清单 4 中使用强度级别 2,所以 “PARIS” 和 “paris” 是相等的。下面是其他有效值的示例:


UCA500R1_LEN_S1 导致 "cliche" = "Cliche" = "cliché" 
UCA500R1_LEN_S2 导致 "cliche" = "Cliche" < "cliché" 
UCA500R1_LEN_S3 导致 "cliche" < "Cliche" < "cliché" 

在DB2 Information Center中可以找到可以作为UCA排序规则名的所有组合(参见 参考资料)。

在不区分大小写的数据库中查询XML数据

因为此数据库使用排序规则名UCA500R1和强度级别2,所以现在可以简化前面的查询,去掉fn:upper-case() 函数(清单 5),就像所有数据都是大写的一样。无论搜索字符串是 “Paris” 或 “PARIS” 还是其他任何大小写组合,结果都是相同的。

清单5. 选择Paris的客户


SELECT id, XMLCAST( XMLQUERY('$XMLDOC/Customer/city') AS VARCHAR(15)) AS cityFROM customerWHERE XMLEXISTS('$XMLDOC/Customer[city = "PARIS"]');  

  图2. 示例查询的结果

示例查询的结果


  如果通过添加ORDER BY子句按提取的city值排序,那么结果集仍然是相同的:PARIS、paris和Paris被当作相同的值。

为了高效地查询此数据,尤其是在表中行数很大的情况下,应该用 XPath /Customer/city 创建一个 XML 索引,见 清单 6:

清单6. 创建XML索引


   CREATE INDEX customer_lang_idx ON test (xmldoc)GENERATE KEY USING XMLPATTERN '/Customer/city' AS SQL VARCHAR(15);  

现在,如果用Visual Explain或db2exfmt解释此查询,就会看到这个不区分大小写的搜索使用了索引:

在不区分大小写的数据库中查询Paris的所有客户的Explain Plan

图3. 在不区分大小写的数据库中查询Paris的所有客户的Explain Plan

本节介绍的方法有一个潜在的缺点:整个数据库中所有表中的所有列中的所有数据都是不区分大小写的。不可能以区分大小写的方式处理特定的表或列。要么都区分大小写,要么都不区分。

注意,不区分大小写只应用于元素和属性值,而不应用于标记名本身。XML 标记和路径表达式仍然是区分大小写的。例如,XPath 表达式 /Customer/city(小写 “c”)和 /Customer/City(大写 “C”)是不同的。后者不匹配示例数据中的任何元素,因为示例数据中的 <CITY>元素名是小写的。

性能

在数据库中使用定制的排序规则可能影响查询性能,因为在选择更宽松的 UCA 设置时,匹配的字符串数量可能会增加。换句话说,在不区分大小写的数据库中,字符串比较的开销可能会略微增加。为了查明区分大小写的和不区分大小写的数据库之间的性能差异,我们创建了一个常规数据库(区分大小写)和一个不区分大小写的数据库。然后,插入来自 TPoX 基准测试的 20,000 个 CustAcc 文档并在这两个数据库中对各种查询进行测试。

对于只涉及少量到中等数量的行的查询,两个测试数据库之间的性能差异可以忽略不计。我们发现涉及大量行的查询的性能差异比较大,比如对所有20,000个XML文档进行全表扫描并对每个文档比较字符串。在不区分大小写的数据库中,这种查询花费的时间增加了 5% 到 8%。因此,实现不区分大小写的搜索需要付出的代价并不大。

结束语

以不区分大小写的方式搜索DB 2数据有多种方法,比如使用生成的列。尽管这些方法都适合关系数据,但是不适合查询XML数据。以不区分大小写的方式处理XML数据的最佳方法是用定制的Unicode排序规则创建数据库。这使数据库中的所有字符串值比较都采用不区分大小写的方式,避免妨碍使用XML索引和关系索引。由于不区分大小写或重音符号,会增加匹配的字符串,但是增加的开销非常低。


用DB2 pureXML执行不区分大小写的高效搜索
 用DB2 pureXML执行不区分大小写的高效搜索(一)
 用DB2 pureXML执行不区分大小写的高效搜索(二)

原文出处:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0811nicola/#author
 
来源:IBM    作者:Matthias Nicola    
 
 
 
 
 

DB2数据库设计

 
你可以针对XML数据使用XMLTABLE函数创建关系型视图。这种功能可以使你提供给应用程序一个关系型或者一个XML数据的混合视图。
 
要改善XML插入性能并降低你数据库中表的数量,你可能想以混合方式存储XML文档。这种方法提取选定XML元素和属性的值并把它们挨着完整的XML文档存储在关系列中。
 
XMLTABLE函数是一个SQL表函数,可以通过XQuery表达式从XML输入文档中创建关系数据行。本文阐述了如何在SQL插入语句中使用XMLTABLE函数来实现对XML的分割。
 
通过完成DB2表测试题,可以测试你对DB2 9的掌握情况。这些题是从以前DB2 9基础认证考试(Exam 730)真题中选出来的。
 
我们想将数据通过以下命令从DB2表导出到平面文件……,但是得到的结果如下(它的结果包括sql、列表名称和消息?EURoe2 record(s) selected?EUR?),但我们要结果显示成……

热门技术手册排行

 

在本次的技术手册中,我们为您提供了PL/SQL的基础知识以及专家指导,包括了PL/SQL中的数据类型简介、PL/SQL函数与触发器以及PL/SQL中的存储过程等,相信您无论是高手还是菜鸟都可以获得有帮助的信息。

 

本系列文章由三部分组成,为Oracle数据库管理员(DBA)面试成功的必备手册。本专题内容囊括从DBA最初的面试开始,从写“杀手简历”到求职信、到面试过程到Oracle认证再到上升到公司高层最后到你成为公司里的明星DBA。专家为你一一指点迷津,最终让你登上成功的宝座。

 

在本次技术手册中,我们将对SQL Server存储过程的调试进行详细的介绍,包括了基础的调试方法和在调试过程中出现的T-SQL性能问题和解决方法。

 

要成为一名DBA,你需要具备哪些素质?DBA的薪酬待遇如何?DBA的职业道路究竟可以走向何方?我们将在本次的技术手册中为您一一解答。

 

本技术专题主要围绕sql server设计这个话题展开,侧重介绍了sql server集簇索引的设计、如何创建sql server索引、如何优化索引、索引的能与不能、处理sql server 2000索引碎片技巧以及维护sql server索引以实现查询优化等等。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录