加速插入

And*_*nea 7 performance sql-server-2008 sql-server optimization insert

我需要一种快速、同步、持续时间最短的插入表的方法。我试过的(“盲”)是:

  • 表上没有任何索引
  • 切换到简单日志记录(从完整日志记录)

我使用的测试场景由 100 个连接组成,每个连接都运行一个 INSERT,然后等待 0.1 秒,然后无限期地再次等待。每个“插入器”记录执行时间。

查看执行时间,我有时会在插入时看到 1.5 秒甚至 10 秒(作为例外情况),否则我看到的是典型的 0.2 秒。

进一步的背景:

  • SQL Server 2008 R2 Express(afaik Express 版本仅限制 DB 大小 (4GB)、RAM (1GB) 和逻辑 CPU (1))
  • 机器:带有 7200 RPM HDD、8 GB RAM 和 8 个逻辑 CPU 的笔记本电脑,托管服务器和客户端
  • 该表由 1 个 BigInt ID(身份)、一个 NVARCHAR(100) 字段和 NVARCHAR(MAX)(此上的 INSERT 具有 10k 有效负载)和一个 NVARCHAR(MAX)(30k 有效负载在 INSERT)列组成

我应该在哪里寻找对此类流程性能的进一步改进?

Dav*_*kle 6

很多人在评论中添加了很多优点。

1) 将您的事务日志分离到不同的驱动器上。使用笔记本电脑会很困难。如果您不能这样做,请为自己的笔记本电脑配备一个 SSD,这将使您的生活变得更好。

2) 将您的数据和日志文件预增长到目标数量。如果您希望将 1GB 的数据添加到您的数据库,请使您的数据和日志文件至少为 1.5GB 以启动。数据和日志文件自动增长是性能的杀手,很可能是您看到这些 10 秒性能“窒息”的原因。SQL Management Studio 有一些内置报告(我相信您右键单击 DB,然后选择 Reports -> Disk Usage)其中应该有一个包含所有自动增长事件的表。)

3) 如果您可以在每个客户端的基础上批量插入插入,则使用 SqlBulkCopy 或 BULK INSERT 语句执行此操作。

4) 应该没有理由为什么您的表不应该有聚集主键。SQL Server 应该能够以相当高效的方式处理 IDENTITY 列上的聚集索引。