我需要一种快速、同步、持续时间最短的方法来插入表。我尝试过的(“盲目”)是:
- 表上没有任何索引
- 切换到简单日志记录(从完整日志记录)
我使用的测试场景由 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)(INSERT 处的 30k 有效负载)列组成
我应该在哪里寻找对此类流程性能的进一步改进?
很多人在评论中补充了很多优点。
1) 将您的事务日志分离到不同的驱动器上。这对于笔记本电脑来说会很困难。如果你不能做到这一点,那就为笔记本电脑买一个 SSD,这应该会让你的生活变得更好。
2) 将您的数据和日志文件预先增长到目标数量。如果您希望将 1GB 的数据添加到您的数据库,请使您的数据和日志文件至少为 1.5GB 才能开始。数据和日志文件的自动增长是性能的杀手,很可能是您看到这些 10 秒性能“阻塞”的原因。SQL Management Studio 有一些内置报告(我相信你右键单击 DB,然后选择 Reports -> Disk Usage),其中应该有一个包含所有自动增长事件的表。)
3) 如果您可以在每个客户端的基础上批量插入,请使用 SqlBulkCopy 或 BULK INSERT 语句来执行此操作。
4) 应该没有理由说明你的表不应该有一个聚集的主键。SQL Server 应该能够以相当高效的方式处理 IDENTITY 列上的聚集索引。
我的建议是离开笔记本电脑。把它放在一台真正的机器上,有快速的驱动器和大量的内存。