1

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

我有一个问题

select * from mytab where name='rohit'

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

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

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

4

2 回答 2

3

第一个问题

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

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

IBM 提供了更复杂的答案。IBM 以复杂的答案而闻名。

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

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

具有不同长度的变长字符串如果仅在尾随空格的数量上有所不同,则它们是相等的。在从这些值的集合中选择一个值的操作中,选择的值是任意的。可能涉及此类任意选择的操作是 DISTINCT、MAX、MIN 和对分组列的引用。有关在引用分组列时涉及的任意选择的更多信息,请参见 GROUP BY 的描述。

第二个问题

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

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

是的,您可以散列名称。不,您不会看到任何性能改进。

原因是 DB2 花费在处理表或表索引上的大部分时间都用于磁盘输入。名称索引的字符串匹配只占处理时间的一小部分。

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

于 2012-09-10T16:18:15.783 回答
0

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

  1. 匹配是否区分大小写?
  2. 字符串末尾的空格重要吗?

对于 varchar(),空格无关紧要,默认行为应该不区分大小写(尽管我不知道这在 DB2 上是否成立)。

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

于 2012-09-10T16:17:30.760 回答