使用同类前缀最大化VARCHAR列的SQL索引的性能

时间:2010-11-17 14:22:41

标签: sql db2

我正在设计一个DB2表,其中一个VARCHAR列将存储字母数字产品标识符。这些ID的前几个字符变化很小。该列将被编入索引,我担心由于共同的前缀,性能可能会受到影响。

据我所知,DB2不使用哈希码来选择VARCHAR。 (至少是基本的DB2,我不知道任何扩展。)

如果这是一个问题,我可以想到三个明显的解决方案。

  1. 创建一个额外的哈希码列。
  2. 向后存储文本,以确保初始字符的良好分布。
  3. 将产品ID分成两列,一列包含足够长的前缀,以便在剩余部分中产生更好的分布。
  4. 当然,每一个都是黑客。

    解决方案#2将提供最佳密钥分发。向后文本可以存储在单独的列中,或者我可以在阅读后反转字符串。每种方法都涉及开销,我想要分析和比较。

    使用解决方案#3,密钥分发仍然不是最优的,我需要在阅读后连接文本,或者使用 3 列来获取数据。

    如果我按原样保留我的产品ID,我的索引可能表现不佳吗?如果是这样,优化性能的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我是一个SQL dba,而不是db2,但我不认为拥有共同的前缀会对你造成伤害,明智的索引。

索引页面只存储一个“from”和“to”范围的键值以及指向实际页面的指针。索引页面恰好存储FrobBar001291FrobBar009281这一事实对数据库引擎来说无关紧要。

事实上,拥有这些通用前缀允许索引利用其他查询,例如:

SELECT * FROM Products WHERE ProductID LIKE 'FrobBar%'

答案 1 :(得分:0)

我同意BradC的观点,我认为这根本不是问题,即使你建议的替代品有一些小的好处,我想所有的开销和复杂性都会超过任何好处。

如果您希望了解并改善索引效果,那么您应该考虑信息中心中的许多主题(特别是最后两个主题似乎相关):http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/nav/2_3_2_4_1喜欢:< / p>

  • 索引结构
  • 索引清理和维护
  • 异步索引清理
  • MDC表的异步索引清理
  • 在线索引碎片整理
  • 使用关系索引来提高性能
  • 关系索引规划提示
  • 关系指数表现提示