首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >执行表操作的最有效方法(规范)。)在具有匹配特定条件的表名的表上。

执行表操作的最有效方法(规范)。)在具有匹配特定条件的表名的表上。
EN

Database Administration用户
提问于 2013-07-05 06:37:13
回答 2查看 721关注 0票数 1

我正在对某些表执行模式转储。这样做的同时,还会丢弃将被丢弃的桌子。例如,我需要删除所有以"SRC_“开头的表。你们想出一种比下面的脚本更有效的丢弃那些表的方法吗?谢谢。

代码语言:javascript
运行
复制
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;
/
EN

回答 2

Database Administration用户

发布于 2013-07-05 06:47:28

为什么代码需要更高效?您似乎不太可能频繁地丢弃大量表,或者需要足够的时间来删除值得优化的表。

为了使代码更有效率,您愿意做哪些权衡?在这种情况下,“效率”是什么意思服务器上消耗的资源?还有别的吗?您编写的代码非常简单,易于理解。例如,您可以通过提交多个作业来使事情复杂化,每个作业都会删除表的一个子集,这样就可以让多个线程同时工作。但这将使代码变得更加复杂--您需要将工作分配给不同的线程,然后协调来自每个线程的响应,以验证所有表都已成功删除。这似乎是最不可能的,这将是一种权衡,你会真正想做,虽然它将减少挂钟所需的时间,以放弃所有的表。

票数 4
EN

Database Administration用户

发布于 2013-07-05 08:35:56

我唯一能做的改变就是:

代码语言:javascript
运行
复制
execute immediate 'drop table ' || rec.TABLE_NAME||' cascade constraints';

如果该表用于强制执行外键,则这将防止语句失败。这里的假设是,任何子表也在这项工作的范围内。如果这个假设是错误的,您会希望以其他方式处理ORA-02449异常。

否则,正如Justin所说,DROP的性能是尽可能快的。

“使用上述方法在每个表中需要删除和添加表列时,会出现性能问题吗?”

这是另一回事。实际上是两个不同的问题。尽管该表不包含任何数据,但添加或删除列所需的时间可以忽略不计。而当表包含数据时存在潜在的问题。

  1. 添加一列。如果该列被认为是强制性的,则在所有行都填充了新列的数据之前,您将无法添加NULL约束。在添加列或作为UPDATE语句时,可以使用DEFAULT子句来实现这一点;无论是哪种方式,都需要与表中的行数成比例的时间。
  2. 删除列此操作在填充表时也需要时间。这就是为什么Oracle提供SET未使用列和DROP列的原因。设置“未使用”要快得多,因为它只是一个数据字典更改;然而,它没有释放任何空间。了解更多信息
  3. 其他与丢柱有关的并发症。试图删除由外键引用的列时,将抛出ORA-12992。并且将列放到分区表上可以是一个总的“mare”。

“默认子句(至少在最近版本的Oracle中)应该使添加新的非空列的时间或多或少地保持不变,因为它只是在数据字典中填充值,而不是在表的每一行中。”

真的吗?当列超过50000行时,添加一个默认值的列要花费更长的时间,而当有两行时。添加没有default子句的列以进行比较。

代码语言:javascript
运行
复制
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> 

我要说的是,我运行的几乎是最新的版本.

代码语言:javascript
运行
复制
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> 

众所周知,华钟时刻表是不可靠的,但经过时间的一般变化似乎相当一致。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/45965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档