【发布时间】:2009-06-22 19:42:26
【问题描述】:
我有一个包含 5,651,744 行的表,主键由 6 列组成(int x 3、smallint、varchar(39)、varchar(2))。我希望通过此表和另一个共享此主键的表以及添加的附加列但有 37m 行来提高性能。
为了添加一列来创建哈希键,我进行了分析,发现了 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),您可以将其删除或替换为标识列吗?
-
为什么这对您来说是个问题?你需要完成什么?
-
问题是我有 200m 行派生统计数据要从 37m 行统计数据中产生,并且 PIVOT 进行计算必须以一个非常大的键为中心,这导致了令人讨厌的急切线轴所有 37m 行到 tempdb。
标签: sql sql-server-2005 checksum hash-collision