加快 SQL Server 2008 中 185k 行的更新速度?
Posted
技术标签:
【中文标题】加快 SQL Server 2008 中 185k 行的更新速度?【英文标题】:Speed up update of 185k rows in SQL Server 2008? 【发布时间】:2012-09-06 03:39:22 【问题描述】:我有一个包含大约 185k 行的二进制文件。 C#
在几秒钟内解析文件。用该数据更新 MSSQL
表的最佳方法是什么?
我尝试过的:
-
最简单的方法 - 读取二进制行、解析、更新表。整个过程大约需要 2 天时间来更新所有数据。
合并 200 个更新查询并立即将它们发送到 MSSQL。在这种情况下,更新需要 8 到 10 小时。
将 500 多个查询合并为一个。运行速度更快,但会不时抛出超时异常,因此某些更新不会进行。
关于如何加快更新过程的任何建议?
【问题讨论】:
这些是更新/插入/删除吗?另外,这张表上有多少索引?总共有多少行?表分区了吗? 请参阅SqlBulkCopy 以传输数据。如果需要,这可能是一个 [临时] 表,然后是MERGE
ed 或诸如此类:然后更新性能主要成为数据库本身的功能。另见this post about updates。
另外,请确保交易正确。如果在事务下运行,则为 1 条记录运行 100 次更新与为 100 条记录运行 1 次更新之间应该有细微差别(这并不完全正确,但这是我的经验法则)。
另见(各种有趣的相关问题)***.com/questions/4889123/…,***.com/questions/4935846/sqlbulkcopy-or-bulk-insert,***.com/questions/11840522/…
【参考方案1】:
不确定您是否真的想通过 C# 执行此操作:可能想使用 BULK INSERT 并为其提供一个数据格式正确的文件。
【讨论】:
SqlBulkCopy 可能更适合 from C# .. 要使用批量插入,您必须能够将数据文件放在SQL Server 的PC 的文件系统上,并且该文件必须可以被sqlservr.exe 访问(访问权限)。 (不在 C:\Users\User 中) @pst 你会重新发表你的评论作为答案,以便我接受吗? SqlBulkCopy + Merge 给了我最好的结果【参考方案2】:使用SqlBulkCopy
(到临时表)后跟MERGE
。
批量复制方法可以使用来自 .NET 客户端的“推送”来有效地传输数据。使用 BULK INSERT
需要从服务器“拉取”(以及所需的本地文件访问权限)。
然后可以使用MERGE
命令(在SQL Server 2008+ 中)根据所需的规则将临时表中的数据插入/更新/更新插入到目标表中。由于此时数据完全在数据库中,因此此操作将尽可能快。使用MERGE
可能还会导致performance advantages 超过许多单独的命令,甚至是同一事务中的那些。
另见:
Any way to SQLBulkCopy "insert or update if exists"? SQL Server 2008 INSERT Optimization【讨论】:
【参考方案3】:我会尝试表值参数:
http://www.codeproject.com/Articles/22392/SQL-Server-2008-Table-Valued-Parameters
【讨论】:
以上是关于加快 SQL Server 2008 中 185k 行的更新速度?的主要内容,如果未能解决你的问题,请参考以下文章
学习笔记:windows server 2008 R2服务器搭建SQL Server 2008 R2环境
为啥安装的SQL SERVER 2008中SQL SERVER 服务只有1个