DB2性能问题

DB2性能问题,db2,zos,Db2,Zos,我必须对数百万条记录运行一个查询,将一个表中的SSN与另一个表中的派生SSN(我是从一个较长的ID派生出来的,该ID将SSN存储为该列的前九个字符)进行比较。 在表1中,SSN存储为十进制(9,0)。在表2中,SSN存储为字符(23)。我运行了一个select,使用此查询获取前9个字符,并检查前9个字符是否为数字: LENGTH(RTRIM(TRANSLATE(left(ee.award_id,9), '', '0123456789'))) = 0 DB2ZOS9不允许我直接将字符转换为十进制

我必须对数百万条记录运行一个查询,将一个表中的SSN与另一个表中的派生SSN(我是从一个较长的ID派生出来的,该ID将SSN存储为该列的前九个字符)进行比较。 在表1中,SSN存储为十进制(9,0)。在表2中,SSN存储为字符(23)。我运行了一个select,使用此查询获取前9个字符,并检查前9个字符是否为数字:

LENGTH(RTRIM(TRANSLATE(left(ee.award_id,9), '', '0123456789'))) = 0
DB2ZOS9不允许我直接将字符转换为十进制,这意味着我必须将字符转换为varchar,然后转换为十进制(9,0),以便与表1中的SSN进行比较

我的问题是: 这样更好吗

  • 将my char派生的SSn双重强制转换为varchar,然后转换为十进制,并与表1或表1中的十进制SSn进行比较

      cast (cast(left(ee.award_id,9) as varchar(9))as decimal(9,0))
    
  • 将十进制SSN转换为varchar和将派生字符SSN转换为varchar,然后比较两者或两者是否更好

  • 这两种性能相同吗


  • 谢谢。

    DB2运行函数的速度非常快。不要花时间优化它。通过选择正确的谓词,您可能会从阶段2到阶段1执行操作,但我认为这不会为您节省足够的CPU/时间

    您应该更关心的是,您选择的操作是否取消了查询使用索引的资格。您还没有描述是否涉及任何索引,因此我们无法直接为您介绍。然而:

    在这种情况下,要提高性能,您可以做的主要事情是尝试对SSN比较进行索引

    根据您正在运行的版本,您可能能够在函数上添加“表达式索引”,以将您的CHAR(23)派生SSN降到您想要比较的9位数字。如果您能够做到这一点,那么添加索引、运行查询,然后删除索引可能是值得的


    您还没有说明是否存在任何性能/时间限制。如果没有任何限制,我看不出有任何理由尝试优化它

    将十进制列转换为字符,然后将其与字符列(前9个字符)进行比较(SSN是否有前导0?)可能会更快。我很惊讶你不能直接铸造它-文档中把它列为可铸造的。您是否能够更改表定义?您当前的两列都不是理想的—SSN不是真正的数字(它们是一个数字字符字符串,虽然应该以无格式存储),存储多部分键是有问题的。我想回答这个问题的最佳方法是尝试这两种方法并比较性能。不幸的是,我无法更改表定义。尝试这两种方法也不是一种选择,在第一次运行之后,数据将已经填充,第二次运行将不再需要。如果TABLE1.SSN在索引中,并且如果在这种情况下可以使用该索引,则在字段上使用函数,然后进行比较,这可能意味着不再使用此类索引。如果不考虑索引,那么我怀疑性能会有很大差异,因为操作可能是I/O绑定的,而不是CPU绑定的。