2013-11-28 62 views
0

我想修剪2列用戶NVARCHAR2(32)並在表LT_NAME中記錄NVARCHAR(80)。 最初這些列是CHAR,所以我需要修剪它們。當表中有40,00,000條記錄時,razorsql崩潰。有人可以在Oracle中建議一個存儲過程來做到這一點嗎?修剪表的存儲過程

+0

請給我們更多 – APC

回答

0

將更新應用於四千萬條記錄需要很長時間,不管您如何操作。

的實際查詢是足夠簡單:

update your_table 
set user = rtrim(user) 
    , record = rtrim(record) 
/

這應該在SQL * Plus運行,提供您的DBA已經充分供應UNDO表空間對於這樣的尺寸表的數據庫。

在開始之前,您應該鎖定整個表格,或者在限制模式下啓動數據庫(如果這是一個選項)。這是爲了確保您可以一舉更新整個表格。


如果你覺得這不回答你的問題,請編輯提供更多的細節,讓你下操作,或許解釋了爲什麼RazorSQL墜毀的約束。

1

對於這些數據量,可能需要一些時間才能完成update語句。而且,它會產生大量的撤消和重做數據。如果你需要更新整個表,而不是它的一部分,CTAS會因爲直接路徑讀取(SGA將被繞過)而產生少量重做,這是完成它的最快方式,但是你會花一些時間重建與表相關的模式對象,約束和授予權限。因此,典型的情況是:

  • 使用CTAS創建一個新表。
  • 重新構建新表上的所有索引(如果舊索引上有索引)
  • 重新創建約束條件(如果有的話)觸發器。
  • 刪除舊錶
  • 重命名新表
  • 授予相應的權限

設置:

/* This small utility package is needed to simply display the size of redo */ 
SQL> create or replace package PKG as 
    2 g_redo number := 0; 
    3 procedure initialize; 
    4 procedure show_redo; 
    5 end; 
    6/
Package created 

SQL> create or replace package body pkg as 
    2 procedure initialize is 
    3 begin 
    4  select ms.value 
    5  into pkg.g_redo 
    6  from v$statname sn 
    7  join v$mystat ms 
    8   on (ms.statistic# = sn.statistic#) 
    9  where sn.name = 'redo size'; 
10 end; 
11 
12 procedure show_redo is 
13  l_redo number; 
14 begin 
15  select (ms.value - pkg.g_redo)/1024 
16  into l_redo 
17  from v$statname sn 
18  join v$mystat ms 
19   on (ms.statistic# = sn.statistic#) 
20  where sn.name = 'redo size'; 
21  dbms_output.put_line('redo size: ' || to_char(l_redo) || ' KB'); 
22 end; 
23 end; 
24/
Package body created 

測試表t1包含,在這個例子中,只有1 200 001行。

SQL> select count(*) as cnt 
    2 from t1; 


cnt 
---------- 
    1200001 

這裏是多少時間和重做花費update 1 200 001行:

SQL> set serveroutput on; 
SQL> set timing on; 
SQL> set autotrace off; 
SQL> set feedback off; 

SQL> exec pkg.initialize; 

Elapsed: 00:00:00.00 

SQL> update t1 
    2  set col1 = trim(col1) 
    3  , col2 = trim(col2); 

Elapsed: 00:00:28.67 

SQL> exec pkg.show_redo; 

redo size: 421024.28515625 KB 

Elapsed: 00:00:00.00 

這裏是多少時間和重做СTAS需要:

SQL> exec pkg.initialize; 

Elapsed: 00:00:00.00 

SQL> create table t2(col1, col2) as 
    2 select trim(col1) 
    3   , trim(col2) 
    4  from t1; 

Elapsed: 00:00:01.85 

SQL> exec pkg.show_redo; 

redo size: 163 KB  

當然你時間和重做大小將有所不同,但CTAS將比常規的update聲明花費更少的時間和重做。