gpt4 book ai didi

sql-server - SQL Server MERGE 慢

转载 作者:行者123 更新时间:2023-12-02 03:14:41 24 4
gpt4 key购买 nike

我正在使用 MERGE 函数将数据导入 SQL Server,速度非常慢。我确定这是因为我没有以最好的方式做事,但我不确定最好的方式是什么。

解释一下,我使用的是 Java,我正在使用 5k MERGE 语句的数据包发出 batchUpdate(我已经尝试过各种批量大小)。合并使用参数,例如在 batchUpdate 上设置的值:

MERGE [MY_DATABASE_TABLE] AS TARGET
USING (SELECT ?, ?, ?, ?, ?, ?, ?, ?) AS SOURCE

那个?当我运行 batchUpdate 时,参数被替换为实际值。我的 MERGE 语句在匹配时确实有许多以下条件检查(例如,如果源为空且目标不为空)

为了指示性能,对于 38k 行的直接 INSERT 语句,时间为 8 秒,对于 MERGE 为 3 分钟。这个时间似乎随着行数的增加呈指数增长(90k 行=23 分钟)。 MYSql 中的相同功能是 10 秒(MySQL 使用重复键更新)。由于 SQL Server 随后会在 MERGE 期间(23 分钟!)锁定我的数据库表,并且我的 90k 行是一个相对较小的测试文件,因此这种性能非常不理想。

这一定是我没有优化的地方。我的 Target 数据库表中的“MERGE On”列都是索引的(唯一键),所以不是这个。我无法为我的源建立索引,因为我的源不是数据库表。这让我想知道我是否应该先将所有数据导入到一个临时表中,然后再从中合并?

我的问题是:我所拥有的 MERGE 应该更快,还是 MERGE 仅在与索引的临时表一起使用时才快?


注意:我使用的是sqljdbc4 v 4.0.x驱动

注意:batchUpdate由org.springframework.jdbc.core.JdbcTemplate提供

最佳答案

代替 MySQL - SQL Server 的 MERGE 不能忽略重复键。即使目标表上的任何唯一索引的 IGNORE_DUP_KEY 设置为 ONMERGE 也会忽略此设置。

是的 MERGE 使用索引临时表会更快。

关于sql-server - SQL Server MERGE 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37745854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com