我已经得到的5651744行的表,用由6列的主键(INT×3,SMALLINT,VARCHAR(39),VARCHAR(2))。我期望通过此表和另一个表共享此主键以及添加一个附加列但具有37m行的另一个表来提高性能。校验和()的碰撞2005
在添加一列创建哈希键的期待,我做了一个分析,发现18,733冲突。
SELECT SUM(CT)
FROM (
SELECT HASH_KEY
,COUNT(*) AS CT
FROM (
SELECT CHECKSUM(DATA_DT_ID, BANK_NUM, COST_CTR_NUM,
GL_ACCT_NUM, ACCT_NUM, APPN_CD) AS HASH_KEY
FROM CUST_ACCT_PRFTBLT
) AS X
GROUP BY HASH_KEY
HAVING COUNT(*) > 1
) AS Y
SELECT COUNT(*)
FROM CUST_ACCT_PRFTBLT
这是大约两倍的坏与给定的目标空间,我需要覆盖的较小的相对量BINARY_CHECKSUM()
这看起来太高(0.33%)?如果碰撞率很高,考虑到您还需要加入常规列以处理偶尔发生的碰撞,那么在联接中首先加入这个制造的密钥会使每行多余的4字节的代价有什么好处?
您一次加入多少条记录?细节表是否有聚集索引?有多宽?如果聚集索引很宽(即它包含所有FK),您可以放弃它还是将其替换为标识列? – 2009-06-24 03:18:02
为什么这是你的问题?你需要完成什么? – 2009-07-06 13:27:30
问题是,我有200m行导出的统计信息从37m行的统计信息中产生,并且执行计算的PIVOT必须在一个非常大的密钥上进行转换,这导致了所有37m行到tempdb的令人讨厌的急切后台处理。 – 2009-07-06 14:33:29