我必须针对数百万条记录运行查询,将一个表中的SSN与派生的SSN进行比较(我将其从一个较长的ID中导出SSN作为此列中的前九个字符)表。 在TABLE1中,SSN存储为十进制(9,0)。在表2中,SSN存储为char(23)。我运行一个选择,使用此查询抓取前9个字符,同时检查前9个字符是否为数字:
LENGTH(RTRIM(TRANSLATE(left(ee.award_id,9), '', '0123456789'))) = 0
DB2 ZOS9不允许我直接将char转换为小数,这意味着我必须将我的char转换为varchar,然后转换为小数(9,0)以便与TABLE1中的SSN进行比较。
我的问题是:
更好吗?将我的char派生的SSn双重转换为varchar然后转换为小数并与TABLE1中的小数SSN进行比较或
cast (cast(left(ee.award_id,9) as varchar(9))as decimal(9,0))
最好将我的十进制SSN转换为varchar,将派生的char SSN转换为varchar,然后比较两者或
是两个相同的表现吗?
感谢。
答案 0 :(得分:1)
DB2在运行函数方面非常快。不要把时间花在优化上。您可以通过选择正确的谓词来将您的操作从第2阶段提升到第1阶段,但我认为它不会为您节省足够的CPU /时间。
您应该更关心的是,您是否通过选择操作取消了查询使用索引的资格。您尚未描述是否涉及任何索引,因此我们无法直接与您说话。但是:
在这种情况下,您可以采取的主要措施是尝试将您的SSN比较编入索引。
根据您正在运行的版本,您可以在函数上添加“表达式索引”,以使您的CHAR(23)派生SSN下降到您想要比较的9位数。如果你能做到这一点,可能值得添加索引,运行查询,然后删除索引。
您还没有说明您是否有任何性能/时序限制。 没有任何限制,我认为没有理由尝试优化它。