电脑技术学习

DB2用户定义函数实现多种语言的排序

dn001
  当 DB2 查询编译器对这个查询进行运算时,它会意识到 ICU.SORTKEY(NAME, 'LFR') 的值已经计算出来了,它会使用 NAME_FR_KEY 列来替代这个值。但是,假如查询使用 ICU.SORTKEY(NAME, 'LES') (西班牙语排序规则),那么 SORTKEY 函数必须作为查询的一部分执行。  不幸的是,将生成的列记录为 VARCHAR(1200) 值会占用表中的大量空间。好在,还有一些办法。  一个办法是修改 createfn.db2,让 SORTKEY 产生长度更短的结果类型。假如这样做了,那么应该减小 sortkey.c 中的常量 MAX_RESULT,还应该重新编译这个 UDF。  另一个办法是将 SORTKEY 的结果转换为更短的 VARCHAR 值。但是,对于使用生成的列的优化器,必须在每个引用中使用同样的转换。这种办法如下所示:  清单 4. 在每个引用中使用同样的转换CREATE TABLE NAMES
  (
  NAME VARCHAR(50),
  NAME_FR_KEY VARCHAR(600)GENERATED ALWAYS AS (CAST(ICU.SORTKEY(NAME, 'LFR')
  AS VARCHAR(600))),
  NAME_DE_KEY VARCHAR(600)GENERATED ALWAYS AS (CAST(ICU.SORTKEY(NAME, 'LDE')
  AS VARCHAR(600)))
  )
  SELECT NAME FROM NAMES
  ORDER BY CAST(ICU.SORTKEY(NAME, 'LFR') AS VARCHAR(600))
  总是需要指定转换,这使这种办法不够理想。可以使用下面的源函数将转换隐藏起来:  清单 5. 使用源函数将转换隐藏起来CREATE FUNCTION MY_SORTKEY(VARCHAR(50), VARCHAR(50))
  RETURNS VARCHAR(600) FOR BIT DATASOURCE ICU.SORTKEYCREATE TABLE NAMES
  (
  NAME VARCHAR(50),
  NAME_FR_KEY VARCHAR(600) GENERATED ALWAYS AS (MY_SORTKEY(NAME, 'LFR')),
  NAME_DE_KEY VARCHAR(600) GENERATED ALWAYS AS (MY_SORTKEY(NAME, 'LDE'))
  )
  SELECT NAME FROM NAMES
  ORDER BY MY_SORTKEY(NAME, 'LFR')
  不管使用哪种方法,重要的考虑因素都是生成的列的长度。SORTKEY 结果的长度可能比原来的字符串长。简单的规则是,对于输入字符串中的每个字符,在输出字符串中答应有 12 字节。(对于某些不常见的排序规则和输入值组合,这个空间甚至也可能不够。)但是,许多排序规则会产生比这短得多的排序键,因此在决定生成的列的大小时,对要使用的排序规则和数据进行一些实验是有帮助的。

标签: 函数