SQL提高了insert的性能?
我正在sql server上执行一些测试,希望获得尽可能最好的插入速度。 我使用的语句如下所示: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
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,从而减少事务日志的开销
如果这还不够快,那么你应该考虑将插入的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%,正如我所说,我只有一个索引,它是主键,没有触发器。我将尝试使用批量插入方法。将源查询排序到目标上的聚集索引。与其将恢复模型更改为简单,不如将其更改为。你可以在批量操作后把它换回来。我正在测试这个。设置填充因子似乎会降低插入速度。直觉上这是有道理的。我猜(没有检查),这样数据会占用更少的磁盘空间。。。