为具有同质前缀的VARCHAR列最大限度地提高SQL索引的性能

为具有同质前缀的VARCHAR列最大限度地提高SQL索引的性能,sql,db2,Sql,Db2,我正在设计一个DB2表,其中一个VARCHAR列将存储字母数字产品标识符。这些ID的前几个字符几乎没有变化。该列将被索引,我担心性能可能会因为通用前缀而受到影响 据我所知,DB2不使用哈希代码来选择varchar。(至少是基本的DB2,我不知道任何扩展。) 如果这是一个问题,我可以想出三个明显的解决办法 创建一个额外的哈希代码列 向后存储文本,以确保初始字符的良好分布 将产品ID分成两列,其中一列包含足够长的前缀,以便在其余部分中生成更好的分布 当然,每一个都是黑客 解决方案2将提供最佳的密钥分

我正在设计一个DB2表,其中一个VARCHAR列将存储字母数字产品标识符。这些ID的前几个字符几乎没有变化。该列将被索引,我担心性能可能会因为通用前缀而受到影响

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

如果这是一个问题,我可以想出三个明显的解决办法

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

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

    使用解决方案#3,密钥分布仍然是非最优的,我需要在阅读后连接文本,或者使用3列作为数据


    如果我保持我的产品ID不变,我的索引是否可能表现不佳?如果是这样的话,优化性能的最佳方法是什么?

    我是SQL dba,不是db2,但我认为在索引方面,使用通用前缀不会对您造成任何伤害

    索引页只存储键值的“from”和“to”范围,并带有指向实际页面的指针。索引页恰好存储
    FrobBar001291
    FrobBar009281
    这一事实对数据库引擎来说应该没有丝毫影响

    事实上,使用这些通用前缀可以让索引利用其他查询,如:

    SELECT * FROM Products WHERE ProductID LIKE 'FrobBar%'
    

    我是SQL dba,不是db2,但我不认为使用通用前缀会对索引造成任何伤害

    索引页只存储键值的“from”和“to”范围,并带有指向实际页面的指针。索引页恰好存储
    FrobBar001291
    FrobBar009281
    这一事实对数据库引擎来说应该没有丝毫影响

    事实上,使用这些通用前缀可以让索引利用其他查询,如:

    SELECT * FROM Products WHERE ProductID LIKE 'FrobBar%'
    

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

    如果你想了解和改进索引性能,在信息中心有许多主题你应该考虑(特别是最后两个主题看起来是相关的):比如:

    • 索引结构
    • 索引清理和维护
    • 异步索引清理
    • MDC表的异步索引清理
    • 联机索引碎片整理
    • 使用关系索引提高性能
    • 关系索引规划技巧
    • 关系索引性能提示

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

    如果你想了解和改进索引性能,在信息中心有许多主题你应该考虑(特别是最后两个主题看起来是相关的):比如:

    • 索引结构
    • 索引清理和维护
    • 异步索引清理
    • MDC表的异步索引清理
    • 联机索引碎片整理
    • 使用关系索引提高性能
    • 关系索引规划技巧
    • 关系索引性能提示

    我是DB2 DBA,我可以告诉您,您是正确的。如果查询看起来足够复杂,DB2也会自动切换到使用哈希技术。这可能不是他想要的,因为DB2创建临时表和散列连接,与简单的索引查找相比,这几乎和怀孕的牦牛一样慢。谢谢。几年前,我看到一篇DeveloperWorks文章讨论了这个“问题”,并提出了字符串反转。不幸的是,我再也找不到这篇文章了。好吧,我是DB2DBA,我可以告诉你,你是对的。如果查询看起来足够复杂,DB2也会自动切换到使用哈希技术。这可能不是他想要的,因为DB2创建临时表和散列连接,与简单的索引查找相比,这几乎和怀孕的牦牛一样慢。谢谢。几年前,我看到一篇DeveloperWorks文章讨论了这个“问题”,并提出了字符串反转。不幸的是,我再也找不到这篇文章了。