我有一些数据的“版本控制”表,每个版本将有150万行,结构是:
[ID] bigint,
[version] int,
[somecolumn] int,
[anothercolumn] int,
[thirdcolumn] tinyint
我经常需要将一个版本复制到另一个版本中,就像这个查询一样:
INSERT INTO myTable
(SELECT ID, version + 1, somecolumn, anothercolumn, thirdcolumn
FROM myTable
WHERE version = @version)
但问题是,这表现得相当慢,每次操作超过10秒。什么是使这项操作像闪电一样快的最佳方法?我已经尝试过选择临时表并从那里合并但是没有做得更快..
答案 0 :(得分:1)
一些想法:
答案 1 :(得分:0)
您是否在版本列中添加了索引?这应该加快速度。
CREATE INDEX IDX_tableName_VERSION ON tableName (version)
<强>更新强>
如何在桌面上使用NOLOCK读取?如果您认为您可以从针对该表的其他事务中获取系统中的脏读,则无效。我之前已经取得了一些成功,只需要小心使用它!
INSERT INTO myTable
(SELECT ID, version + 1, somecolumn, anothercolumn, thirdcolumn
FROM myTable WITH(NOLOCK)
WHERE version = @version)
答案 2 :(得分:0)
看看是否有效。
begin
SELECT ID, version + 1, somecolumn, anothercolumn, thirdcolumn
into #temp
FROM myTable
WHERE version = @version
ALTER INDEX IDX_tableName_VERSION ON tableName.version DISABLE
INSERT INTO myTable
select * from #temp
ALTER INDEX IDX_tableName_VERSION ON tableName.version ENABLE
end