-----我的代码执行时间太长了。执行时间为1074秒。谁能告诉我有什么方法可以让我执行得更快-------
set serveroutput on;
declare
table_or_view_does_not_exist exception;
pragma exception_init(table_or_view_does_not_exist,-00942);
d_table varchar2(200);
q_table varchar2(200);
r_emp SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST();
type t_list is table of all_tab_columns%rowtype index by PLS_INTEGER;
v_array t_list;
begin
begin
d_table:='drop table subs_profile_spcl_char PURGE';
execute immediate d_table;
exception
when table_or_view_does_not_exist then
null;
end;
dbms_output.put_line('Table has been dropped');
q_table:='create table subs_profile_spcl_char
(column_name varchar2(50),
spcl_char_count Number)';
execute immediate q_table;
dbms_output.put_line('Table has been created');
dbms_output.enable;
select /*parallel(14)*/ * bulk collect into v_array from all_tab_columns where table_name='SUBSCRIBER_PROFILE' and OWNER='MIG';
for i in 1..v_array.count() loop
r_emp.extend;
EXECUTE IMMEDIATE
'select /*parallel(16)*/ count(*) from '||v_array(i).table_name||' where not regexp_like ('||v_array(i).column_name||',''[A-za-z0-9.]'')'
into r_emp(i);
if r_emp(i)<>0 then
dbms_output.put_line(v_array(i).column_name||'------------>>>>'||r_emp(i));
execute immediate 'insert into subs_profile_spcl_char values (:param1,:param2)' using v_array(i).column_name,r_emp(i);
end if;
end loop;
end;
1条答案
按热度按时间5gfr0r5j1#
在我看来,有一些反对意见。
truncate
比delete
快,但是是不可逆的。因为您实际上删除了表,所以我认为您可以使用它)CHAR
数据类型系列列r_emp
集合。将计数取到标量变量中(在我的示例中为l_cnt
)select /*+ parallel */
(您缺少一个加号)dbms_output
占用资源;如果你不需要它,就把它移走(你不需要;结果无论如何都被存储到表中)insert
好吧,给你,这是你可以尝试做的。
在SQL级别(重新)创建目标表:
PL/SQL代码:
它花了580毫秒(相对于你的1000秒)。
扫描的列数:
不带过滤器:
如果可以检查200列,为什么还要检查40,000列?
最终结果: