我正在对某些表执行模式转储。这样做的同时,还会丢弃将被丢弃的桌子。例如,我需要删除所有以"SRC_“开头的表。你们想出一种比下面的脚本更有效的丢弃那些表的方法吗?谢谢。
begin
for rec in (select TABLE_NAME
from ALL_TABLES
where TABLE_NAME like 'SRC|_%' escape '|'
and OWNER = 'SOME_SCHEMA')
loop
execute immediate 'drop table ' || rec.TABLE_NAME;
end loop;
end;
/
发布于 2013-07-05 06:47:28
为什么代码需要更高效?您似乎不太可能频繁地丢弃大量表,或者需要足够的时间来删除值得优化的表。
为了使代码更有效率,您愿意做哪些权衡?在这种情况下,“效率”是什么意思服务器上消耗的资源?还有别的吗?您编写的代码非常简单,易于理解。例如,您可以通过提交多个作业来使事情复杂化,每个作业都会删除表的一个子集,这样就可以让多个线程同时工作。但这将使代码变得更加复杂--您需要将工作分配给不同的线程,然后协调来自每个线程的响应,以验证所有表都已成功删除。这似乎是最不可能的,这将是一种权衡,你会真正想做,虽然它将减少挂钟所需的时间,以放弃所有的表。
发布于 2013-07-05 08:35:56
我唯一能做的改变就是:
execute immediate 'drop table ' || rec.TABLE_NAME||' cascade constraints';
如果该表用于强制执行外键,则这将防止语句失败。这里的假设是,任何子表也在这项工作的范围内。如果这个假设是错误的,您会希望以其他方式处理ORA-02449异常。
否则,正如Justin所说,DROP的性能是尽可能快的。
“使用上述方法在每个表中需要删除和添加表列时,会出现性能问题吗?”
这是另一回事。实际上是两个不同的问题。尽管该表不包含任何数据,但添加或删除列所需的时间可以忽略不计。而当表包含数据时存在潜在的问题。
“默认子句(至少在最近版本的Oracle中)应该使添加新的非空列的时间或多或少地保持不变,因为它只是在数据字典中填充值,而不是在表的每一行中。”
真的吗?当列超过50000行时,添加一个默认值的列要花费更长的时间,而当有两行时。添加没有default
子句的列以进行比较。
SQL> select * from t1;
COL1 COL2 COL3 COL4 C C
---------- ---------- ---------- ---------- - -
7.2000E+75 -7.200E-75 Y N
1.2346E+14 Y N
SQL> set timing on
SQL> alter table t1 add col7 varchar2(1) default 'A'
2 /
Table altered.
Elapsed: 00:00:00.06
SQL> insert into t1 (col1, col2, col3) select object_id, object_id*-1, rownum from all_objects
2 /
56481 rows created.
Elapsed: 00:00:11.35
SQL> alter table t1 add col8 varchar2(1) default 'X'
2 /
Table altered.
Elapsed: 00:00:01.80
SQL> alter table t1 add col9 varchar2(1) ;
Table altered.
Elapsed: 00:00:00.08
SQL>
我要说的是,我运行的几乎是最新的版本.
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
Elapsed: 00:00:00.06
SQL>
众所周知,华钟时刻表是不可靠的,但经过时间的一般变化似乎相当一致。
https://dba.stackexchange.com/questions/45965
复制相似问题