我们在SQL Server 2008数据库中使用单个表进行审计。没有更新的SQL快速插入
单表体系结构很好地工作,很容易查询,适应模式更改。
但它是整个数据库的主要瓶颈。所有INSERTS和UPDATES都必须通过审核表。
我们已经对SELECT语句使用了NOLOCK HINT。
由于此表没有更新,是否有任何改善INSERT语句吞吐量的建议?
我们在SQL Server 2008数据库中使用单个表进行审计。没有更新的SQL快速插入
单表体系结构很好地工作,很容易查询,适应模式更改。
但它是整个数据库的主要瓶颈。所有INSERTS和UPDATES都必须通过审核表。
我们已经对SELECT语句使用了NOLOCK HINT。
由于此表没有更新,是否有任何改善INSERT语句吞吐量的建议?
确保您在表格上具有INT(或BIGINT)IDENTITY主聚簇索引!最好不要使用其他索引(如果可能的话) - 这会降低插入速度。
这是一个常见的误解,即由于表只需要INSERT并且几乎没有读取,所以应该自己“保存”主密钥的麻烦。
与SQL Server索引的女神,金佰利特里普,解释了她出色的博客文章The Clustered Index Debate continues:
镶片在群集 表更快(但仅限于“正确”的 聚集表),比与一个 堆相比。这里的主要问题是,IAM/PFS中的 查找确定 堆中的插入位置是 比聚簇表 (其中插入位置已知, 由聚簇键定义)慢。当插入表 插入表 其中定义顺序(CL)和其中 的顺序是不断增加。
所以一个右聚集索引可以加快你的插入,在这里是指静态的(不会改变),独特的,尽可能小(INT或BIGINT),最好不断增加(无页拆分和因此没有性能损失)。
此外,如果您的表只获取插入并且没有更新/删除,则应确保在聚集索引上使用100%FILLFACTOR以完全填充这些SQL服务器页面。
马克
唯一的建议,我会做是:
join
或union
“实时”和“较早”的审核。如果你只附加到审计表和运行要总是最后执行表扫描报告,认为在表中删除任何索引。
我正在沿着这些路线工作。 我有一个IDENTITY CLUSTERED PRIMARY KEY,所以INSERTs真的是APPENDs在最后一页。 100%的填充因子是一个很好的触摸。 我正在考虑每月进行一次维护,将记录移到“永久性”历史记录表中,以便主表永远不会变大。 – pkario 2009-08-22 15:46:11
好吧,如果你的索引不断增加,即使表的大小真的不是什么大问题(显然除了选择) – 2009-08-22 15:49:37