2010-09-10 78 views
1

對此使用Sybase ASE 15 - 我有大量的行(最多10 mil)從表中定期刪除,但我想保留一個選擇將最新添加的數據添加到表中,以便在表格中直接截斷使用截斷。從Sybase表中有選擇地刪除大量數據

delete from master_table where... 

使用上述刪除是很慢的,所以我的策略是將我要保持到一個臨時表中的數據,截斷主表和臨時表中的數據再次遷回即

1) select * into #temp_table from master_table where date_updated > dateadd(mi, -15, getdate()) and node_type != 'X' 
2) truncate table master_table 
3) insert into master_table select * from #temp_table 

這幾乎是不夠好的 - 1 & 2有很好的表現,但插回到主人太慢了。

所以我的問題真的可以歸結爲是否有這樣做的任何的快捷方式:

delete from master_table where... 
insert into xyz select * from... 

或者我打開替代辦法!

回答

1

可能你最好的解決方案是使用分區。

我不知道Sybase的分區細節,但是,如果您可以創建基於時間的分區,則可以通過更改分區來刪除它們。

然而,您將需要一些能創建未來分區並刪除舊分區的東西 - 這是一個您必須維護的軟件(它可能是一個存儲過程或腳本,可以在數據庫服務器上運行或在「克朗「工作等)。

您還需要確保那些node_type ='X'的人被正確刪除。

也許你可以創建兩組日常分區,一個用於node_type ='X',另一個用於其他node_types,並且每天創建新的分區(對於明天和可能的一天),並刪除舊分區如果您確實需要這些數據,則不需要或合併它們。

0

根據您的情況,快速bc​​p可以使插入快速運行。 這將改變你的整體設計需要一個shell腳本(或批處理文件),但它可以工作(如果你的表被設計爲允許快速BCP)

的另一件事看就是爲什麼插入是慢。它是否是磁盤問題?需要更新的索引過多?可能會出現這樣的情況,即對數據庫結構進行某些調整可能會加快速度。

1

從master_table(到temp_table)中複製很快,但將這些行復制回master_table的操作很慢。所以,你在master_table上有索引,約束和觸發器。您可能需要查看這些信息,看看它們是否真的需要用於「定期」批量插入和刪除的表格,並根據您的業務需求找到替代方案。

下面的解決方案假定master_table沒有任何依賴或約束。既然你正在「定期」這樣做,並且無論如何都刪除了大部分master_table行,使用永久temp_table會更快。

-- Create the copy table, for the first run 
-- if not exists 
create table master_table_copy   -- This is your permanent temp_table 
as select * from master_table where 1=2 

-- Copy rows you want to keep 
insert into master_table_copy 
select * from master_table 
where date_updated > dateadd(mi, -15, getdate()) 
and node_type != 'X' 

truncate table master_table 

-- Rename the tables 
exec sp_rename 'master_table', 'master_table_orig' 
exec sp_rename 'master_table_copy', 'master_table' 
exec sp_rename 'master_table_orig', 'master_table_copy' -- use for next time