SQL加速插入性能?

时间:2011-08-17 09:02:46

标签: sql tsql insert

我正在sql server上执行一些测试,我想获得最佳的插入速度。 我使用的陈述是这样的:

INSERT INTO db_Test_databse..tbl_test with(rowlock)  
   (  joinid, date_key,   
      col1, col2,col3,col4, col5, col6, col7, col8, col9, col10,  ...     
   )  

SELECT  tabid as joinid, 
        date_key,
        rec_type,  
        col2,  
        dbo.udf_convert_hex_to_dec(col3),  
        col4, col5, col6, col7, col8,  
        dbo.udf_convert_hex_to_dec(col9),  
        dbo.udf_convert_hex_to_dec(col10),  
        ...
from source_table f

有25列;其中大多数是bigint或int类型。

我删除了目标表中的所有索引,除了作为标识字段的主键。

有关如何提高性能的任何提示?

P.S。在这种形式中,我的平均速度为16.000行/秒。

3 个答案:

答案 0 :(得分:17)

要获得最佳效果,您应该:

  • 删除表格上的所有触发器和约束
  • 删除所有索引,插入
  • 所需的索引除外
  • 确保您的聚簇索引始终在表的末尾插入新记录(标识列可以正常运行)。这可以防止页面拆分(SQL Server必须移动数据,因为现有页面已满)
  • fill factor设置为0或100(它们是等效的),以便表格中的空格不会为空,从而减少数据传播的页数。
  • 将数据库的recovery model更改为Simple,从而减少事务日志的开销。

多个客户端是否并行插入记录?如果是这样,那么你也应该考虑锁定的含义。

请注意,SQL Server可以为by executing the query in SQL Server Management StudioDatabase Engine Tuning Advisor建议给定查询的索引。您应该这样做以确保您没有删除SQL Server用于加速INSERT的索引。

如果这仍然不够快,那么您应该考虑使用BULK INSERT(或类似bcp utilitySqlBulkCopy的内容对插入内容进行分组,两者都使用{{1}在封面下)。这将在插入行时提供最高的吞吐量。

另见Optimizing Bulk Import Performance - 该文章中的许多建议也适用于“普通”插入。

答案 1 :(得分:1)

你考虑过使用SqlBulkCopy吗?您需要构建一个DataTable并将其传递给WriteToServer例程。

这很快!

答案 2 :(得分:1)

您可以在结束前在商店程序中使用

 OPTION(RECOMPILE)