Database 修剪表的存储过程
我试图修剪2列用户NVARCHAR2(32)并在一个表LT_名称中记录NVARCHAR(80)。Database 修剪表的存储过程,database,oracle,stored-procedures,Database,Oracle,Stored Procedures,我试图修剪2列用户NVARCHAR2(32)并在一个表LT_名称中记录NVARCHAR(80)。 最初这些列是CHAR,所以我需要对它们进行修剪。razorsql崩溃,因为该表有4000000条记录。是否有人建议在Oracle中使用存储过程来执行此操作?对4000万条记录应用更新将花费很长时间,无论您如何操作 实际查询非常简单: update your_table set user = rtrim(user) , record = rtrim(record) / 这应该在SQL*Pl
最初这些列是CHAR,所以我需要对它们进行修剪。razorsql崩溃,因为该表有4000000条记录。是否有人建议在Oracle中使用存储过程来执行此操作?对4000万条记录应用更新将花费很长时间,无论您如何操作 实际查询非常简单:
update your_table
set user = rtrim(user)
, record = rtrim(record)
/
这应该在SQL*Plus中运行,前提是您的DBA已经为具有如此大小的表的数据库提供了足够的UNDO表空间
您应该在开始之前锁定整个表,或者在受限模式下启动数据库(如果这是一个选项)。这是为了确保您可以一次性更新整个表
如果您觉得这不能回答您的问题,请对其进行编辑以提供更多详细信息,给出您正在操作的约束条件,并解释RazorSQL崩溃的原因 有了这么多的数据,
update
语句可能需要一些时间才能完成。此外,它将生成大量的撤消和重做数据。如果您需要更新整个表,而不是它的一部分,由于直接路径读取(SGA将被绕过)和很少的重做生成,CTA将是完成更新的最快方法,但您将花费一些时间来重建与表相关的模式对象、约束和授予特权。因此,典型的情况是:
- 使用CTA创建一个新表
- 重新生成新表上的所有索引(如果旧表上有任何索引)
- 如果存在约束、触发器,则重新创建约束
- 放下旧桌子
- 重命名新表
- 授予适当的特权
/* 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
仅包含1200 001行
SQL> select count(*) as cnt
2 from t1;
cnt
----------
1200001
以下是更新1200 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
当然,您的时间和重做大小会有所不同,但CTA比常规的
update
语句花费的时间和重做时间要少得多 请再给我们一些