0
我有一个表被截断,每天加载的数据问题是截断表需要一段时间,用户注意到这一点。我想知道的是,有没有办法让两个相同的表格和截断一个然后加载新的数据,然后让用户用户那个新表,并只是在两个表之间切换。SQL Server表交换
我有一个表被截断,每天加载的数据问题是截断表需要一段时间,用户注意到这一点。我想知道的是,有没有办法让两个相同的表格和截断一个然后加载新的数据,然后让用户用户那个新表,并只是在两个表之间切换。SQL Server表交换
如果您正在清除旧表以及填充新表,可以使用OUTPUT子句。注意日志增长的潜力,如果这可能是一个问题,考虑循环/批处理方法。
DELETE
OldDatabase.dbo.MyTable
OUTPUT
DELETED.col1
, DELETED.col2
, DELETED.col3
INTO
NewDatabase.dbo.MyTable
或者你可以使用BCP这是一个方便的选择要注意。请注意,这是使用SQLCMD语法。
:setvar SourceServer OldServer
:setvar SourceDatabase OldDatabase
:setvar DestinationServer NewServer
:setvar DestinationDatabase NewDatabase
:setvar BCPFilePath "C:\"
!!bcp "$(SourceDatabase).dbo.MyTable" FORMAT nul -S "$(SourceServer)" -T -n -q -f "$(BCPFilePath)MyTable.fmt"
!!bcp "SELECT * FROM $(SourceDatabase).dbo.MyTable WHERE col1=x AND col2=y" queryout "$(BCPFilePath)MyTable.dat" -S "$(SourceServer)" -T -q -f "$(BCPFilePath)MyTable.fmt" -> "$(BCPFilePath)MyTable.txt"
!!bcp "$(DestinationDatabase).dbo.MyTable" in $(BCPFilePath)MyTable.dat -S $(DestinationServer) -T -E -q -b 2500 -h "TABLOCK" -f $(BCPFilePath)MyTable.fmt
在这里有很多超级聪明和有经验的人。如果您详细介绍了存储的内容,存储的原因以及截断的原因,您将获得更多有用的响应。还包括任何语言/软件/版本信息。 – Kieveli
虽然'TRUNCATE'很快,它将需要架构修改锁;它将被并发活动阻止,反之亦然。 'SWITCH'也是如此,它可以用作交换设计的一部分。 “SWITCH”的优点是负载可以单独发生。 –
也许你可以用同义词做到这一点。让用户只知道同义词并将其从一个表切换到另一个表 – Turo