1

我有一个 ETL 过程性能问题。我有一张表,里面有 4+ 十亿行。结构是:

  • idbigint 身份(1,1)
  • raw_urlvarchar(2000) 不为空
  • md5hashchar(32) 不为空
  • job_control_numberint 不为空

id 上的聚集唯一索引和 md5hash 上的非聚集唯一索引

SQL Server 2008 Enterprise 页面级压缩已打开

我们必须将来自网络服务器日志的原始 URL 存储为维度。由于原始字符串 > 900 个字符,我们不能在该列上放置唯一索引。我们使用 md5 哈希函数来创建唯一的 32 个字符的字符串以用于索引目的。我们不能在表中允许重复的 raw_url 字符串。

问题是性能不佳。md5hash 本质上当然是随机的,因此索引碎片驱动到 50%,这导致 IO 效率低下。

寻找有关如何构造它以允许更好的插入和查找性能以及更少的索引碎片的建议。

4

2 回答 2

1

我会将表分解为物理文件,将较旧的不变数据放在只读文件组中。确保非聚集索引也在文件组中。

编辑(来自评论):当我在考虑它时,如果你关闭页面级压缩,那也会改善 I/O。

于 2009-09-14T14:39:26.700 回答
1

我认为它应该是事实表中的退化维度。

并想办法对数据进行分区。也许取前 xxx 个字符并将它们存储为一个单独的字段,然后按此分区。然后,当您进行查找时,您将传递短列和长列,因此它首先在分区中查找。

于 2009-11-05T17:51:57.763 回答