我有一个存储图像的表,每个图像的大小在 16-100 KB 之间。由于图像太小,我接受了Microsoft 的建议,没有使用 FILESTREAM 数据类型。该表的构造很简单:
CREATE TABLE Screenshot(
Id bigint NOT NULL,
Data varbinary(max) NOT NULL,
CONSTRAINT PK_Screenshot PRIMARY KEY CLUSTERED
(
Id ASC
)WITH (PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
该表被大量插入(过去一周有 200 万条记录)并且很少被选中。关键是使用hilo 算法,因此在大多数情况下,最后都会添加新行。
当许多进程由于锁定和争用而尝试插入此表时,我遇到了问题。查询因等待锁而超时。
我应该将此表迁移到它自己的文件组和驱动器吗?在这种情况下,如何提高插入性能并减少争用?
您可以尝试更改 id 生成,以便插入不会相互竞争,或者考虑设置
ALLOW_PAGE_LOCKS = OFF
,注意对索引维护的影响(这可能仅在您还进行更新时才相关)既然您提到了 FILESTREAM,我希望您使用的是 SQL Server 2008。与其猜测瓶颈是什么以及如何改进,不如使用扩展事件来识别它并进行负载测试 [http://www.datamanipulation.net/sqlquerystress /]关于这个活动。
http://blogs.technet.com/b/sqlos/archive/2008/07/18/debugging-slow-response-times-in-sql-server-2008.aspx
一旦您确定了瓶颈,找出解决方案总是很容易、正确且物有所值。