作法是:
1. 使用
bcp公用程式將符合條件的資料匯出
2. create temp table
3. 將兩個table名稱互換
4. 觀察一段時間,運行正常後再考慮刪除原始table(已改名過的那個)
雖然truncate很快但無法設定條件,不適用於此案例。而delete勢必造成運行速度下滑或table lock
用bcp來處理的話不必快速而且可以保留住原始table
bcp queryout語法如下:
DECLARE @cmd varchar( 2000 )
SELECT @cmd = 'bcp "Select * from testDB.dbo.testTable Where LastTxDate > dateadd(day,-365,getdate()) " queryout "c:\testTable_queryout.txt" -c -T -r "\n"'
EXEC master..xp_cmdshell @cmd
bcp in語法如下:
DECLARE @cmd varchar( 2000 )
SELECT @cmd = 'bcp testDB.dbo.testTable_backup in "c:\testTable_queryout.txt" -c -T -r "\n"'
EXEC master..xp_cmdshell @cmd
因軟硬體環境不同,以下測試資料僅供參考:
測試DB的testTable 共29517筆,bcp out的檔案大小: 21.1
MB
以bcp out匯出全部共29517的時間為4.59秒,每秒處理6425.12 rows
以bcp queryout匯出符合條件之4327筆的時間為0.38秒,每秒處理11538.67 rows
以bcp out匯入全部共29517的時間為5.25秒,每秒處理5622.29 rows
以bcp queryout匯入符合條件之4327筆的時間為0.24秒,每秒處理18412.77 rows
參考資料:
使用 bcp 公用程式匯入及匯出大量資料 (SQL Server)
bcp 公用程式 詳細參數說明
SQLServer數據導入導出工具BCP詳解
bcp 匯出與匯入