2010-09-02 49 views
1

我有一個包含大約400,000多行的表。我正在編寫一些模式匹配代碼,但在我這樣做之前需要清理一個列。這歸結爲做一個類似替換的操作。SQL性能(替換)

我試圖把它們列出所有出一次一個......

Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southeast ',' se ') 
Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southwest ',' sw ') 

由於我有過的這500 ......花了太長時間。

現在我試圖巢他們...

Update T_ADDRESS set ADDR_LINEONE = REPLACE(REPLACE(ADDR_LINEONE,' southwest ',' sw '),' southeast ',' se ') 

但這仍然是痛苦的緩慢。我需要使這個代碼在所有大小的表上工作(1條記錄到500萬條記錄)。

任何人有任何建議?順便說一句,我正在使用SQL Server。

回答

6

你必須始終掃描表端至端無論你怎麼看中做REPLACE 。這就是殺死性能的原因,因爲您必須以任何合理的方式對ADDR_LINEONE字段進行索引,所以無法更改。

由於這應該是一次性唯一的操作,所以很長時間應該不重要。

如果這是一個反覆操作,那麼你的問題不在這裏,是你如何將數據加載到表:做改造之前你保存數據,否則你的立場沒有機會。

+4

+1:這是您爲允許錯誤數據而付的稅 – 2010-09-02 15:53:56

0

創建新值#TEMP表,然後內部聯接 像這樣的事情

create table #TempValues 
(oldAres varchar(12),newadres varchar(2)) 

insert into #TempValues 
select 'southeast','se' 
union all 
select 'southwest','sw' 

update T_ADDRESS 
set addr_lineone=t.newadres 
from T_ADDRESS inner join #TempValues t on T_ADDRESS.addr_lineone=t.oldAdres 
0

您可以編寫更新語句,以使用CASE語句代替多個REPLACE,但我不知道這是否會爲您執行更快的操作。