什么是db2的内部工作来比较字符串

时间:2012-09-10 16:02:28

标签: sql db2 string-comparison

db2用于比较字符串的内部工作是什么?

我有一个查询

  

从mytab中选择* name ='rohit'

如何将每行中的名称与值'rohit'进行比较

我也想到一个列,每个名称(varchar)列都有一个哈希码,上面有索引。所以无论何时我寻找一个名字,我都应该寻找哈希码。

这种方法是否可行并且可以获得性能?

2 个答案:

答案 0 :(得分:3)

第一个问题

  

DB2用于比较字符串的内部工作是什么?

简单的答案是区分大小写的匹配。

more complicated answer由IBM提供。 IBM因复杂的答案而闻名。

  

通过比较每个字符串的相应字节来比较两个字符串。如果字符串的长度不同,则使用空白填充的较短字符串的临时副本进行比较,使其与另一个字符串具有相同的长度。

     

如果它们都是空的或者所有相应的字节相等,则两个字符串相等。空字符串等于空字符串。如果两个字符串不相等,则它们的关系(即具有较大值的关系)由字符串左端的第一对不等字节的比较确定。根据与数据的编码方案相关联的整理顺序进行该比较。对于ASCII数据,字符A到Z(大写和小写)的值大于字符0到9.对于EBCDIC数据,字符A到Z(大写和小写)的值小于字符0到9。

     

如果只有尾随空白的数量不同,则不同长度的变长字符串相等。在从这些值的集合中选择一个值的操作中,所选择的值是任意的。可以涉及这种任意选择的操作是DISTINCT,MAX,MIN和对分组列的引用。有关对分组列的引用所涉及的任意选择的更多信息,请参阅GROUP BY的说明。

第二个问题

  

我也想到一个列,每个名称(varchar)列都有一个哈希码,上面有索引。所以每当我找到一个名字时,我都应该寻找哈希码。

     

这种方法是否可行并且可以获得性能?

是的,你可以哈希名字。不,你不会看到任何性能提升。

原因是DB2在磁盘输入中使用了大多数时间通过表或表索引。名称索引的字符串匹配只是处理时间的一小部分。

您可能考虑实施的一件事是soundex名称匹配。

答案 1 :(得分:0)

比较由SQL语言本身定义。当名称完全匹配时,行匹配条件。有几种变化:

  1. 匹配区分大小写?
  2. 字符串末尾的空格是否重要?
  3. 对于varchar(),空格应该无关紧要,并且默认行为应该是不区分大小写的(尽管我不知道DB2上是否也是这样)。

    使用完全匹配的索引可以获得更好的性能。