加快 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 以传输数据。如果需要,这可能是一个 [临时] 表,然后是 MERGEed 或诸如此类:然后更新性能主要成为数据库本身的功能。另见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个

关于SQL Server中的“数据库实例文件初始化”

安装sql server 2008不能更改安装路径吗

安装SQL SERVER 2008,出现“查找sql server 2008安装媒体”的问题

SQL Server - 加快大表的计数