如何使Oracle SQL Update更快,表包含大约500万条记录。
update TableName set
ColumnName1= TRANSLATE (Columnname1,
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA'),
ColumnName2= '';
更新 20分钟。
我该怎么做才能加快查询速度?
答案 0 :(得分:1)
您可以拆分为翻译部分和更新部分。
翻译部分(没有锁定数据库):
select
TRANSLATE (
Columnname1,
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA') AS ColumnName1
, ' ' AS ColumnName2
from TableName;
更新部分: 你可以使用sql-loader,例如比如this。
答案 1 :(得分:1)
首先,空字符串在Oracle中等效于NULL。
你这样做是最有效的方式。你在一个UPDATE更新整个表;所以你在这里几乎没有选择。最明显的事情是并行化。
如果您使用的是Oracle Enterprise Edition,则可以使用PARALLEL hint:
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;
/
另一种选择是升级基础设施......
答案 2 :(得分:-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 = '' ;
让我知道它是否比您之前的查询更好。