Database 修剪表的存储过程

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

我试图修剪2列用户NVARCHAR2(32)并在一个表LT_名称中记录NVARCHAR(80)。
最初这些列是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
语句花费的时间和重做时间要少得多

请再给我们一些