我有一個數據庫每天增加一百萬行。每天我都想運行一個查詢來抽出最老的行(在數據庫中留下大約一千萬),然後將它們移動到一個存檔數據庫中。將數百萬行從一個sql server數據庫複製到另一個數據庫的最佳方法是什麼?
在sql server(bcp,openrowset等)中這樣做有很好的記錄方式,但從我所知道的,所有這些方法都是從數據文件中獲取所有行。我只想複製行的一個子集,我找不到任何快速的方法。
我有一個數據庫每天增加一百萬行。每天我都想運行一個查詢來抽出最老的行(在數據庫中留下大約一千萬),然後將它們移動到一個存檔數據庫中。將數百萬行從一個sql server數據庫複製到另一個數據庫的最佳方法是什麼?
在sql server(bcp,openrowset等)中這樣做有很好的記錄方式,但從我所知道的,所有這些方法都是從數據文件中獲取所有行。我只想複製行的一個子集,我找不到任何快速的方法。
我會建議考慮一個SSIS包。您可以精確控制要複製的行,您可以按照您選擇的事務大小來執行此操作,並且可以快速進行批量插入。
做到這一點,最簡單的方法是充分利用合格的名稱
INSERT INTO ArchiveDatabase..TableName
SELECT *
FROM ProductionDatabase..TableName
WHERE EntryDate <= dateadd(mm, -6, current_timestamp)
要通過大量的數據拷貝它往往是更好地做到這一點「基於塊」的查詢。在純TSQL做到這一點,最簡單的方法是這樣的:
DECLARE @rowcount int
SET @rowcount = 1
WHILE @rowcount <> 0
BEGIN
INSERT INTO ArchiveDatabase..TableName
SELECT TOP (100000) *
FROM ProductionDatabase..TableName
WHERE EntryDate <= dateadd(mm, -6, current_timestamp)
SET @rowcount = @@ROWCOUNT
END
基本上限制查詢到100K行與SELECT TOP()
條款和不斷循環,直到沒有更多的記錄複製過來。 (@@ROWCOUNT
返回受影響的記錄數。)
如果數據庫位於不同的SQL Server上,則可以設置「鏈接服務器」並將服務器引用添加到對象名稱。完全限定對象名稱的格式是<Server>.<Database>.<Owner>.<Object>
它們在不同的服務器上還是在同一臺服務器上?另外,您是否也想從源中刪除數據? – Anon246 2010-07-02 21:21:46