0

如何使 Oracle SQL 更新更快,表包含大约 500 万条记录。

update TableName set    
ColumnName1= TRANSLATE (Columnname1,
   '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
   '9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA'),
ColumnName2=  '';

更新需要20分钟

我可以做些什么来加快查询速度?

4

3 回答 3

1

首先,空字符串在 Oracle 中相当于 NULL。

您正在以最有效的方式执行此操作。您正在一次更新中更新整个表;所以你在这里几乎没有选择。最明显的事情是并行化。

如果您使用的是 Oracle 企业版,则可以使用PARALLEL 提示

update /*+ parallel(tablename, 4) */ tablename
   set col1 = <some stuff>
     , col2 = null

4 这里是并行会话的数量。

如果您使用的是标准版,那么值得一看DBMS_PARALLEL_EXECUTE;这会将您首先更新的表分块,然后并行执行 UPDATE:

declare
  l_sql varchar2(32767);
  l_status number;
begin


  dbms_parallel_execute.create_task ('mytask');

  dbms_parallel_execute.create_chunks_by_rowid
       ('mytask', user, 'TABLENAME', true, 10000);

  l_sql := 'update /*+ rowid (dda) */ tablename 
               set col1 = <some stuff>
                 , col2 = null
             where rowid between :start_id and :end_id';

  dbms_parallel_execute.run_task
      ( 'mytask', l_sql, dbms_sql.native, parallel_level => 4);

  l_status := dbms_parallel_execute.task_status('mytask');

  if l_status = dbms_parallel_execute.finished then
     dbms_parallel_execute.drop_task('mytask');
  end if;

end;
/

另一种选择当然是升级基础设施......

于 2013-09-16T07:48:22.977 回答
1

您可以拆分为翻译部分和更新部分。

翻译部分(不锁定数据库):

select     
 TRANSLATE (
     Columnname1,
     '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
     '9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA') AS ColumnName1
, ' ' AS ColumnName2
from TableName;

更新部分:您可以使用 sql-loader,例如这样

于 2013-09-16T06:24:53.087 回答
-1

这可能会更快。

update TableName set
ColumnName1 = replace(replace(replace(@Columnname1 COLLATE Latin1_General_CS_AS,'0123456789', '9876543210')COLLATE Latin1_General_CS_AS,'abcdefghijklmnopqrstuvwxyz','zyxwvutsrqponmlkjihgfedcba')COLLATE Latin1_General_CS_AS,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','ZYXWVUTSRQPONMLKJIHGFEDCBA') 
ColumnName2 = '' ;

让我知道它是否比您之前的查询更好。

于 2013-09-16T06:17:39.107 回答