Sql 分页将批量数据插入表中
也许这是一个愚蠢的问题,但是如何分割/分页插入以让其他操作更新同一个表呢 我有两个存储过程,一个用于插入批量数据 存储过程Sql 分页将批量数据插入表中,sql,sql-server,locking,bulkinsert,sql-merge,Sql,Sql Server,Locking,Bulkinsert,Sql Merge,也许这是一个愚蠢的问题,但是如何分割/分页插入以让其他操作更新同一个表呢 我有两个存储过程,一个用于插入批量数据 存储过程插入MyTable: INSERT INTO MyTable (column1, Column2, Column3) SELECT Column1, @Column2, 0 FROM MyOtherTable MyTable的主键是(第1列,第2列) 还可以对同一个表执行MERGE操作MyTable,但可以从另一个来源进行更新(第3列),也可以将数据插入MyTable 问题
插入MyTable
:
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM MyOtherTable
MyTable
的主键是(第1列,第2列)
还可以对同一个表执行MERGE
操作MyTable
,但可以从另一个来源进行更新(第3列),也可以将数据插入MyTable
问题是,当插入MyTable
需要花费大量时间1000万条记录时,执行MERGE
的存储过程必须等待InsertIntoMyTable
完成
尝试解决此问题时,添加了分页
DECLARE @Start INT = 1
DECLARE @End INT = 1000
DECLARE @Amount INT = 1000
DECLARE @Total INT
SELECT @Total = COUNT(Column1) FROM MyOtherTable WHERE Column2 = @Column2
WHILE (@Start<=@Total)
BEGIN
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM (SELECT
Column1,
Row_number() OVER(ORDER BY Column1) rownumber
FROM MyOtherTable
WHERE Column2 = @Column2) x
WHERE x.rownumber between @start and @end
SET @start = @end+1
SET @End = @End + @Amount
END
DECLARE@Start INT=1
声明@End INT=1000
声明@Amount INT=1000
声明@Total INT
从MyOtherTable中选择@Total=COUNT(Column1),其中Column2=@Column2
虽然(@Start执行是在事务中进行的,但如果您自己不提供显式事务,SQL Server将使用隐式事务
如果您有超过5000个操作(插入
,删除
,更新
)在单个事务中,SQL Server将删除单个行锁,而不是执行锁升级,而是独占地锁定整个表——因此在提交(或回滚)该(可能隐式)事务之前,不可能执行其他操作
插入到1000行块中的部分不应导致锁升级,但当然,在该事务上下文中插入的任何行都不能同时被另一个事务读取或操作。我已经更改了代码。WHILE(@Start