【发布时间】:2010-11-20 04:11:27
【问题描述】:
好的。我已经在这里和那里阅读了有关 SQL Server 堆的内容,但没有什么太确定而无法真正指导我。我将尝试衡量性能,但希望对我应该研究的内容提供一些指导。这是 SQL Server 2008 企业版。以下是表格:
工作
- JobID(PK、GUID、外部生成)
- 开始日期(日期时间2)
- 账户ID
- 更多会计字段,主要是小数和大整数
工作步骤
- JobStepID(PK、GUID、外部生成)
- JobID FK
- 开始日期
- 更多会计字段,主要是小数和大整数
用法:大量插入(数百次/秒),通常每个作业 1 个 JobStep。估计每月可能有 100-200M 行。根本没有更新,唯一的删除来自归档超过 3 个月的数据。
对数据执行约 10 次查询/秒。有的加入 JobSteps 到 Jobs,有的只看 Jobs。几乎所有查询都将在 StartDate 上进行,其中大多数包括 AccountId 和其他一些会计字段(我们对它们有索引)。查询非常简单 - 执行计划的最大部分是 JobSteps 的连接。
优先级是插入性能。数据出现在查询中的延迟(5 分钟左右)是可以容忍的,因此复制到其他服务器并在它们之外运行查询当然是允许的。
除了将 JobSteps 加入到 Jobs 之外,基于 GUID 的查找非常少见。
当前设置:没有聚集索引。唯一看起来像候选人的是 StartDate。但是,它并没有完美地增加。可以在 StartDate 之后的 3 小时窗口内的任何位置插入作业。这可能意味着以非最终顺序插入一百万行。
1 个 Job + 1 个 JobStepId 的数据大小,使用我当前的索引,大约是 500 字节。
问题:
这对堆有用吗?
集群对 StartDate 的影响是什么,当它在大约 2 小时/100 万行中几乎没有顺序时?我的猜测是不断的重新排序会杀死插入性能。
我是否应该只添加 bigint PK 来获得更小的、总是增加的键? (我仍然需要用于查找的指南。)
我读过GUIDs as PRIMARY KEYs and/or the clustering key,它似乎暗示即使发明一个键也可以在其他索引上节省大量空间。还有一些资源表明堆通常存在某种性能问题,但我不确定这是否仍然适用于 SQL 2008。
再一次,是的,我将尝试执行测试和测量。我只是想获得一些指导或指向其他文章的链接,以便我可以就要考虑的路径做出更明智的决定。
【问题讨论】:
标签: sql sql-server performance sql-server-2008 indexing