AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18648
Accepted
syneticon-dj
syneticon-dj
Asked: 2012-06-01 10:37:58 +0800 CST2012-06-01 10:37:58 +0800 CST 2012-06-01 10:37:58 +0800 CST

sqlcmd 对 SQL Server 2008 R2 慢

  • 772

我正在尝试导入一个较长的 SQL 脚本(350 万行,大小为 1.5 GB),其中主要包含带有数据的短 INSERT INTO 语句,sqlcmd -E -d <database> -S 127.0.0.1 -i <scriptfile>并且它几乎停止(大约每秒 150 行)而没有推断出任何明显的SQL server 主机上的负载(所有 CPU 内核几乎处于空闲状态,磁盘吞吐量约为 200 KB/s)。

由于源文件位于 NFS 共享上,我首先怀疑这是罪魁祸首,但本地可用的相同脚本以相同的速度运行。

数据库基本上是空的,表是由相同的脚本创建的,没有触发器或其他花哨的东西——只是原始的,主要是数字或 varchar 数据。

SQLCMD 还在等什么?有什么办法可以加快速度吗?

编辑:

我们在更改 SQL 脚本文件中的数据方面受到限制。数据由第三方提供用于导入程序。我相信它最初是使用 Management Studio 2005“脚本表作为...”功能导出的。

由于庞大的文件大小,编辑文件很乏味 - 任何操作都需要使用普通文本编辑器,尽管预先设置“SET NOCOUNT ON”是通过将两个文件复制在一起完成的 - 它带来了大约 50% 的加速。

由于文本编码 (Unicode-LE),如果不进行转换,就不可能使用通用的 GNU textutils 集(否则它可以很好地处理大文件)进行编辑 - 而且由于数据保真度问题可能会导致我不愿意转换来吧。

因此,我对如何应用有关插入 BEGIN TRAN/COMMIT TRAN 块或将单个插入转换为更大集合的建议感到有些困惑。

sql-server-2008 insert
  • 1 1 个回答
  • 7372 Views

1 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-06-01T10:43:34+08:002012-06-01T10:43:34+08:00

    一些想法:

    • GO每几千行或几千行注入一些命令。然后,它不是一个巨大的批次,而是分成多个批次。
    • 将您的个人INSERT陈述更改为INSERT ... VALUES ()每组一千套。
    • 无偿使用事务和提交和/或检查点(同样,每 1000 次左右的插入可能是一个很好的起点,与 结合使用GO)。您的手表和日志会感谢您。
    • 这是一件愚蠢的小事,但请确保您的脚本具有SET NOCOUNT ON- 否则 UI、SQL Server 和其间的网络会花费大量时间1 row(s) affected来回发送每次插入的消息。
    • 最好的可能是使用BULK INSERT、BCP甚至SSIS而不是 Management Studio。部分问题可能是您自己的机器上的内存开销只是加载那个巨大的文件,别介意尝试解析/执行它。在此过程中,我很想看到 ssms.exe 的私有字节...
    • 基于与 OP 的离线讨论,添加另一个选项:要求供应商提供备份而不是脚本。然后您可以将其恢复到某个测试或虚拟系统,并从中手动生成插入(或使用导入/导出,或 Red Gate 的数据比较工具)。这可能最终会花费相同的时间,但不会用包含数百万个插入的庞大脚本杀死日志......
    • 12

相关问题

  • 连接不同地理区域的数据库的最佳实践

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve