有几件事浮现在脑海。主键是 GUID 还是整数,如果它是 GUID 并且您在其上进行了集群,那么 SQL Server 将不得不在许多不同的位置插入而不是按顺序插入。你是数据库大小,是你的日志大小还是它们一直自动增长,请参阅调整数据库文件大小
运行分析器并查看 nhibernate 创建了什么样的 SQL。每秒 1000 次插入不再那么令人印象深刻,瓶颈也可能是硬件,确保它的大小和配置正确。tempdb、日志和数据文件是否在同一个驱动器上?如果是这样,请将它们移动到单独的驱动器
另一种选择是重写执行这些插入的部分并将它们批处理而不是单行插入
这是我从 SSMS 运行的一个示例,它在 166 毫秒内插入 4999 次,在 40 毫秒内插入 1000 次
CREATE TABLE Sometest(id INT PRIMARY KEY,
SomeCol VARCHAR(200), SomeDate DATETIME,SomeCol2 VARCHAR(200),
SomeDate2 DATETIME,SomeCol3 VARCHAR(200),
SomeDate3 DATETIME,SomeCol4 VARCHAR(200), SomeDate4 DATETIME)
GO
DECLARE @start DATETIME = GETDATE()
SET NOCOUNT ON
DECLARE @id INT =1
WHILE @id < 1000
BEGIN
INSERT Sometest
SELECT @id ,'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla111111',GETDATE(),
'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla2222',GETDATE(),
'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla3333',GETDATE(),
'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla4444',GETDATE()
SET @id+=1
END
SELECT DATEDIFF(ms,@start,GETDATE())
SELECT COUNT(*) FROM Sometest
如果你将整个事情包装在一个事务中,它会快得多,50000 次插入在 800 毫秒内,5000 次插入在 103 毫秒内,1000 次插入在 23 毫秒内
TRUNCATE TABLE Sometest
DECLARE @start DATETIME = GETDATE()
SET NOCOUNT ON
BEGIN tran
DECLARE @id INT =1
WHILE @id < 50000
BEGIN
INSERT Sometest
SELECT @id ,'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla111111',GETDATE(),
'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla2222',GETDATE(),
'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla3333',GETDATE(),
'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla4444',GETDATE()
SET @id+=1
END
commit
SELECT DATEDIFF(ms,@start,GETDATE())
SELECT COUNT(*) FROM Sometest
在您的系统上使用看起来像您的表的表运行类似的东西并调查问题所在,也许您需要预先调整文件大小、分离文件、对表进行碎片整理等等等