Sql插件加速

Cor*_*rei 12 sql t-sql 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jus*_*tin 17

为了获得最佳性能,您应该:

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

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

请注意,SQL Server可以通过在SQL Server Management Studio中执行查询或通过数据库引擎优化顾问来建议给定查询的索引.您应该这样做,以确保您没有删除SQL Server正在使用的索引来加快速度INSERT.

如果这仍然不够快,那么你应该考虑将一个使用的插入分组BULK INSERT(或者类似于bcp实用程序,或者SqlBulkCopy两者都BULK INSERT在封面下使用).这将在插入行时提供最高的吞吐量.

另请参阅优化批量导入性能 - 该文章中的大部分建议也适用于"普通"插入.