我想修剪2列用戶NVARCHAR2(32)並在表LT_NAME中記錄NVARCHAR(80)。 最初這些列是CHAR,所以我需要修剪它們。當表中有40,00,000條記錄時,razorsql崩潰。有人可以在Oracle中建議一個存儲過程來做到這一點嗎?修剪表的存儲過程
Q
修剪表的存儲過程
0
A
回答
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
聲明花費更少的時間和重做。
相關問題
- 1. 修改存儲過程中的表格
- 2. 如何在存儲過程中修剪字符串的空格?
- 3. 如何使用存儲過程中的修剪sql查詢
- 4. 修復存儲過程?
- 5. 修改存儲過程是否更新存儲過程定義?
- 6. MySQL將表存儲過程從存儲過程保存到表
- 7. 修改不執行的存儲過程
- 8. 使用其他存儲過程的存儲過程列表
- 9. 找出誰修改了存儲過程
- 10. 修改SQL從存儲過程
- 11. 無法修復存儲過程錯誤
- 12. 如何修改ASP.NET MEmbership存儲過程
- 13. SQL存儲過程修改與IF-ELSE
- 14. SQL存儲過程 - 修改代碼
- 15. 存儲過程修改時間
- 16. Oracle:查找修改表中記錄的存儲過程
- 17. MySQL - 修改存儲過程中的表格語法
- 18. 存儲過程表安全
- 19. 存儲過程返回表
- 20. 返回表存儲過程
- 21. 修剪BOLD_CLOCKLOG表
- 22. 修剪MySQL表
- 23. 是否存在創建sysdiagrams表並支持存儲過程的存儲過程?
- 24. 存儲過程
- 25. 存儲過程
- 26. 存儲過程
- 27. 存儲過程
- 28. 存儲過程
- 29. 存儲過程
- 30. 存儲過程
請給我們更多 – APC