SQL提高了insert的性能?

SQL提高了insert的性能?,sql,tsql,insert,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, dat

我正在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类型

我删除了目标表中的所有索引,除了主键(标识字段)之外

关于如何进一步提高性能,有什么建议吗


另外,在这个表单中,我的平均速度是每秒16.000行。

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


太快了

要获得尽可能最好的性能,您应该:

  • 删除表上的所有触发器和约束
  • 删除所有索引,插入所需的索引除外
  • 确保聚集索引总是在表的末尾插入新记录(标识列就可以了)。这可以防止页面拆分(因为现有页面已满,所以SQL Server必须四处移动数据)
  • 将设置为0或100(它们是等效的),以便表中的空间不为空,从而减少数据分布的页数
  • 将数据库的属性更改为Simple,从而减少事务日志的开销
是否有多个客户端并行插入记录?如果是这样,那么您还应该考虑锁定的含义

请注意,SQL Server可以为给定查询建议索引,也可以通过。您应该这样做,以确保没有删除SQL Server用来加速插入的索引

如果这还不够快,那么你应该考虑将插入的As替换成一个As(或者类似的OR,这两个都使用“代码>批量插入< /代码>”下的封面)。这将在插入行时提供最高的吞吐量


另请参阅-该文章中的许多建议也适用于“正常”插入。

您可以在结束前在存储过程中使用

 OPTION(RECOMPILE)

dbo.udf\u convert\u hex\u to\u dec
会杀了你。您使用的是哪个版本的SQL Server?我怀疑地看着
udf\u convert\u hex\u to\u dec
函数。插入只能在一定程度上更快,一些因素是索引和物理IO性能。对它运行一个查询分析器,我打赌select是慢的部分,因为这个函数。用户定义的函数可能慢。您不能直接将十六进制转换为十进制吗?例如>?select的成本是9%,表假脱机的成本是32%,集群插入的成本是58%,正如我所说,我只有一个索引,它是主键,没有触发器。我将尝试使用批量插入方法。将源查询排序到目标上的聚集索引。与其将恢复模型更改为简单,不如将其更改为。你可以在批量操作后把它换回来。我正在测试这个。设置填充因子似乎会降低插入速度。直觉上这是有道理的。我猜(没有检查),这样数据会占用更少的磁盘空间。。。