SQL快速INSERT没有UPDATE

时间:2009-08-22 15:07:25

标签: sql-server insert

我们在SQL Server 2008数据库中使用单个表进行审核。

单表架构运行良好,查询简单,适应架构更改。

但它是整个数据库的主要瓶颈。所有INSERTS和UPDATES都必须通过审计表。

我们已经将NOLOCK HINT用于SELECT语句。

由于此表没有UPDATE,是否有任何改进INSERT语句吞吐量的建议?

3 个答案:

答案 0 :(得分:4)

确保表上有INT(或BIGINT)IDENTITY主聚簇索引!并且最好没有其他指数(如果可能的话) - 那些会降低插入速度。

这是一个常见的误解,因为表只需要INSERT而几乎不需要任何读取,所以你应该“省去”自己主要的群集密钥的麻烦。

作为SQL Server索引的女神,Kimberly Tripp在她出色的博文The Clustered Index Debate continues中解释道:

  

群集中的插入速度更快   桌子(但只在“右边”   聚集表)比一个   堆。这里的主要问题是   在IAM / PFS中查找以确定   堆中的插入位置是   比集群表中的速度慢   (插入位置已知,   由聚簇键定义)。插入   插入表格时速度更快   定义顺序(CL)和位置   这个顺序不断增加。

所以正确聚簇索引可以加速插入,这里就意味着静态(永不改变),唯一,尽可能小(INT或BIGINT),最好是不断增加(没有页面)分裂,因此没有性能损失)。

此外,如果您的表只进行插入而没有更新/删除,则应确保在聚簇索引上使用100%FILLFACTOR来完全填充这些SQL服务器页面。

马克

答案 1 :(得分:2)

我要做的唯一建议是:

  • 确保您尽可能多地编写非字符串值
  • 通过存储过程封装您对审核的写入
  • 从存储过程调用中获取任何其他数据,或
  • 考虑在审计细分中使用单独的for-for-purpose View。确保其连接尽可能小。在尝试查找字符串数据的FK时,此视图将用于查找审计消息的PK等。
  • 不是推荐,而是一个事实:更少的索引意味着更快的插入+更慢的选择。
  • 考虑将“旧”审核行归档到另一个表。保持审计表尽可能小。将那些较旧的审计行移动到另一个表。要进行报告/查询,请创建一个joinunion“实时”和“较早”审核的视图。

答案 2 :(得分:0)

如果您只是附加到审计表并运行将始终最终执行表扫描的报表,请考虑删除表中的任何索引。