HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

空还是非空——浅谈非空约束对执行计划以及性能的影响

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2011-07-21 08:01:37

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

    非空约束是字段的一个重要属性。但是,很多时候,数据库表的设计人员似乎并不十分在意这个属性。最常见的现象就是,除了主键字段外,所有字段都不指定该属性。而在Oracle中,默认是允许为空。

    而实际上,优化器在选择执行计划时,非空约束是一个重要的影响因素。为了说明问题,我们建立以下测试表,然后分别说明非空约束在各种情况下对执行计划和性能的影响。

SQL代码
  1. HELLODBA.COM>create table t_test1 tablespace DEMO as select * from dba_objects;  
  2.   
  3. Table created.  
  4.   
  5. HELLODBA.COM>alter table T_TEST1 add constraint T_TEST1_PK primary key (OBJECT_ID) using index  tablespace DEMOTSINX;  
  6.   
  7. Table altered.  
  8.   
  9. HELLODBA.COM>update t_test1 set SUBOBJECT_NAME=OBJECT_NAME where SUBOBJECT_NAME is null;  
  10.   
  11. 32072 rows updated.  
  12.   
  13. HELLODBA.COM>commit;  
  14.   
  15. Commit complete.  
  16.   
  17. HELLODBA.COM>desc t_test1  
  18.  Name          Null?    Type  
  19.  ---------------------------------------------------------------------------------------------------------------------------------  
  20.  OWNER         NOT NULL VARCHAR2(30)  
  21.  OBJECT_NAME   NOT NULL VARCHAR2(30)  
  22.  SUBOBJECT_NAME         VARCHAR2(30)  
  23.  OBJECT_ID     NOT NULL NUMBER  
  24.  DATA_OBJECT_ID         NUMBER  
  25.  OBJECT_TYPE            VARCHAR2(19)  
  26.  CREATED       NOT NULL DATE  
  27.  LAST_DDL_TIME NOT NULL DATE  
  28.  TIMESTAMP              VARCHAR2(19)  
  29.  STATUS                 VARCHAR2(7)  
  30.  TEMPORARY              VARCHAR2(1)  
  31.  GENERATED              VARCHAR2(1)  
  32.  SECONDARY              VARCHAR2(1)  
  33.  LIO                    NUMBER  

谓词评估

    在上面表中,字段SUBOBJECT_NAME中不存在空值,但也没有非空约束,再看以下查询,查找该字段的空值记录:

SQL代码
  1. HELLODBA.COM>select * from t_test1 where SUBOBJECT_NAME is null;  
  2.   
  3. no rows selected  
  4.   
  5. Execution Plan  
  6. ----------------------------------------------------------  
  7. Plan hash value: 1883417357  
  8.   
  9. -----------------------------------------------------------------------------  
  10. | Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |  
  11. -----------------------------------------------------------------------------  
  12. |   0 | SELECT STATEMENT  |         |     1 |    96 |    45   (0)| 00:00:46 |  
  13. |*  1 |  TABLE ACCESS FULL| T_TEST1 |     1 |    96 |    45   (0)| 00:00:46 |  
  14. -----------------------------------------------------------------------------  
  15.   
  16. Predicate Information (identified by operation id):  
  17. ---------------------------------------------------  
  18.   
  19.    1 - filter("SUBOBJECT_NAME" IS NULL)  
  20.   
  21. Statistics  
  22. ----------------------------------------------------------  
  23.           0  recursive calls  
  24.           0  db block gets  
  25.         665  consistent gets  
  26.           0  physical reads  
  27.           0  redo size  
  28.        1048  bytes sent via SQL*Net to client  
  29.         374  bytes received via SQL*Net from client  
  30.           1  SQL*Net roundtrips to/from client  
  31.           0  sorts (memory)  
  32.           0  sorts (disk)  
  33.           0  rows processed  

    我们看到,需要对表进行全表扫描(关于索引,随后再讨论)。而如果我们加上非空约束,可以看到执行计划已经性能的变化:

SQL代码
  1. HELLODBA.COM>alter table t_test1 modify SUBOBJECT_NAME not null;  
  2.   
  3. Table altered.  
  4.   
  5. HELLODBA.COM>select * from t_test1 where SUBOBJECT_NAME is null;  
  6.   
  7. no rows selected  
  8.   
  9. Execution Plan  
  10. ----------------------------------------------------------  
  11. Plan hash value: 4146611218  
  12.   
  13. ------------------------------------------------------------------------------  
  14. | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |  
  15. ------------------------------------------------------------------------------  
  16. |   0 | SELECT STATEMENT   |         |     1 |    96 |     0   (0)|          |  
  17. |*  1 |  FILTER            |         |       |       |            |          |  
  18. |   2 |   TABLE ACCESS FULL| T_TEST1 | 47585 |  4461K|    45   (0)| 00:00:46 |  
  19. ------------------------------------------------------------------------------  
  20.   
  21. Predicate Information (identified by operation id):  
  22. ---------------------------------------------------  
  23.   
  24.    1 - filter(NULL IS NOT NULL)  
  25.   
  26.   
  27. Statistics  
  28. ----------------------------------------------------------  
  29.           0  recursive calls  
  30.           0  db block gets  
  31.           0  consistent gets  
  32.           0  physical reads  
  33.           0  redo size  
  34.        1048  bytes sent via SQL*Net to client  
  35.         374  bytes received via SQL*Net from client  
  36.           1  SQL*Net roundtrips to/from client  
  37.           0  sorts (memory)  
  38.           0  sorts (disk)  
  39.           0  rows processed  

    注意到,在全表扫描之前,增加了一个filter,而fileter的表达式是NULL IS NOT NULL,其逻辑结果是FALSE,因此,实际上其子操作(全表扫描)并未执行。相应的,请性能数据里面CR为0。

    之所以优化器会为执行计划增加这样一个filter,是因为优化器在做查询转换(Query Transformation)时,会将非空约束作为参照条件之一,对where子句的谓词做逻辑结果评估,如果评估结果为false,则会增加一个这样的filter,以避免执行一些高代价的操作。从10053跟踪文件中,可以看到这对于优化器对执行计划代价估算的影响:

SQL代码
  1. Cdn, Cost adjusted (to ~ 0) as where clause evalutes to FALSE  
  2. Final - All Rows Plan:  Best join order: 1  
  3.   Cost: 0.0000  Degree: 1  Card: 1.0000  Bytes: 4568160  
  4.   Resc: 0.0000  Resc_io: 0.0000  Resc_cpu: 0  
  5.   Resp: 0.0000  Resp_io: 0.0000  Resc_cpu: 0  

非空约束对索引选择的影响

    我们知道,Oracle中B*树索引中不存在空键值,即在表的数据记录中,如果索引中所有字段都为空,则该记录不会被构建到索引树中。也就是说,如果索引字段上没有非空约束,则表记录与索引记录不是完全映射的。

    我们先去掉subobject_name上的非空约束,并在上面建立索引:

SQL代码
  1. HELLODBA.COM>alter table t_test1 modify subobject_name null;  
  2.   
  3. Table altered.  
  4.   
  5. HELLODBA.COM>create index t_test1_subo_idx on t_test1(subobject_name) compute statistics;  
  6.   
  7. Index created.  

    执行以下语句,以获取subobject_name最小的10条记录。为了提高效率,我们希望直接从索引中直接读取前10条ROWID(索引数据已经按照subobject_name排序),然后根据ROWID获取数据记录:

SQL代码
  1. HELLODBA.COM>select owner,object_name,subobject_name from t_test1 t1, (select /*+index(t t_test1_subo_idx)*/rowid rid from t_test1 t where rownum<=10order by subobject_name) v where t1.rowid=v.rid;  
  2.   
  3. OWNER                          OBJECT_NAME                    SUBOBJECT_NAME  
  4. ------------------------------ ------------------------------ ------------------------------  
  5. SYS                            ICOL$                          BBB  
  6. SYS                            I_USER1                        BBB  
  7. SYS                            CON$                           BBB  
  8. SYS                            UNDO$                          BBB  
  9. SYS                            I_PROXY_ROLE_DATA$_1           BBB  
  10. SYS                            I_OBJ#                         BBB  
  11. SYS                            PROXY_ROLE_DATA$               BBB  
  12. SYS                            I_IND1                         BBB  
  13. SYS                            I_CDEF2                        BBB  
  14. SYS                            C_COBJ#                        BBB  
  15.   
  16. 10 rows selected.  
  17.   
  18.   
  19. Execution Plan  
  20. ----------------------------------------------------------  
  21. Plan hash value: 4050478946  
  22.   
  23. -----------------------------------------------------------------------------------------------  
  24. | Id  | Operation                   | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |  
  25. -----------------------------------------------------------------------------------------------  
  26. |   0 | SELECT STATEMENT            |         |    10 |   560 |       |   308   (1)| 00:05:09 |  
  27. |   1 |  NESTED LOOPS               |         |    10 |   560 |       |   308   (1)| 00:05:09 |  
  28. |   2 |   VIEW                      |         |    10 |   120 |       |   298   (1)| 00:04:59 |  
  29. |   3 |    SORT ORDER BY            |         |    10 |   160 |  2248K|   298   (1)| 00:04:59 |  
  30. |*  4 |     COUNT STOPKEY           |         |       |       |       |            |          |  
  31. |   5 |      TABLE ACCESS FULL      | T_TEST1 | 47585 |   743K|       |    45   (0)| 00:00:46 |  
  32. |   6 |   TABLE ACCESS BY USER ROWID| T_TEST1 |     1 |    44 |       |     1   (0)| 00:00:02 |  
  33. -----------------------------------------------------------------------------------------------  
  34.   
  35. Predicate Information (identified by operation id):  
  36. ---------------------------------------------------  
  37.   
  38.    4 - filter(ROWNUM<=10)  
  39.   
  40.   
  41. Statistics  
  42. ----------------------------------------------------------  
  43.           0  recursive calls  
  44.           0  db block gets  
  45.          14  consistent gets  
  46.           0  physical reads  
  47.           0  redo size  
  48.         707  bytes sent via SQL*Net to client  
  49.         385  bytes received via SQL*Net from client  
  50.           2  SQL*Net roundtrips to/from client  
  51.           1  sorts (memory)  
  52.           0  sorts (disk)  
  53.          10  rows processed  

    但是,查询计划和结果看,语句并没有按照设想的方式执行,得出的数据也不是我们需要的。其原因就在于,由于空值不被索引,优化器无法确认索引数据是否涵盖了所有数据记录,因而它没有选择指定索引。

    我们把非空约束加上,执行计划和结果就符合我们的需求了。

SQL代码
  1. HELLODBA.COM>alter table t_test1 modify subobject_name not null;  
  2.   
  3. Table altered.  
  4.   
  5. HELLODBA.COM>select owner,object_name,subobject_name from t_test1 t1, (select /*+index(t t_test1_subo_idx)*/rowid rid from t_test1 t where rownum<=10  
  6. order by subobject_name) v where t1.rowid=v.rid;  
  7.   
  8. OWNER                          OBJECT_NAME                    SUBOBJECT_NAME  
  9. ------------------------------ ------------------------------ ------------------------------  
  10. DEMO                           NO                             A  
  11. DEMO                           NO                             A  
  12. DEMO                           NO                             A  
  13. SYS                            ICOL$                          BBB  
  14. SYS                            I_USER1                        BBB  
  15. SYS                            CON$                           BBB  
  16. SYS                            UNDO$                          BBB  
  17. SYS                            C_COBJ#                        BBB  
  18. SYS                            I_OBJ#                         BBB  
  19. SYS                            PROXY_ROLE_DATA$               BBB  
  20.   
  21. 10 rows selected.  
  22.   
  23.   
  24. Execution Plan  
  25. ----------------------------------------------------------  
  26. Plan hash value: 3198566056  
  27.   
  28. ------------------------------------------------------------------------------------------------  
  29. | Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |  
  30. ------------------------------------------------------------------------------------------------  
  31. |   0 | SELECT STATEMENT            |                  |    10 |   560 |    71   (0)| 00:01:11 |  
  32. |   1 |  NESTED LOOPS               |                  |    10 |   560 |    71   (0)| 00:01:11 |  
  33. |   2 |   VIEW                      |                  |    10 |   120 |    61   (0)| 00:01:01 |  
  34. |*  3 |    COUNT STOPKEY            |                  |       |       |            |          |  
  35. |   4 |     INDEX FULL SCAN         | T_TEST1_SUBO_IDX | 47585 |   743K|    61   (0)| 00:01:01 |  
  36. |   5 |   TABLE ACCESS BY USER ROWID| T_TEST1          |     1 |    44 |     1   (0)| 00:00:02 |  
  37. ------------------------------------------------------------------------------------------------  
  38.   
  39. Predicate Information (identified by operation id):  
  40. ---------------------------------------------------  
  41.   
  42.    3 - filter(ROWNUM<=10)  
  43.   
  44.   
  45. Statistics  
  46. ----------------------------------------------------------  
  47.           0  recursive calls  
  48.           0  db block gets  
  49.          13  consistent gets  
  50.           0  physical reads  
  51.           0  redo size  
  52.         681  bytes sent via SQL*Net to client  
  53.         385  bytes received via SQL*Net from client  
  54.           2  SQL*Net roundtrips to/from client  
  55.           0  sorts (memory)  
  56.           0  sorts (disk)  
  57.          10  rows processed  

非空约束对连接查询的影响

    在进行数据关联时,数据集中关联字段是否存在空值也会影响优化器对执行计划的选择。我们再创建一张测试表。

SQL代码
  1. HELLODBA.COM>create table t_test2 tablespace DEMO as select * from dba_tables;  
  2.   
  3. Table created.  
  4.   
  5. HELLODBA.COM>alter table T_TEST2 add constraint T_TEST2_PK primary key (OWNER,TABLE_NAME) using index  tablespace DEMOTSINX;  
  6.   
  7. Table altered.  
  8.   
  9. HELLODBA.COM>desc t_test2  
  10.  Name          Null?    Type  
  11. -------------- -------- -----------------  
  12.  OWNER         NOT NULL VARCHAR2(30)  
  13.  TABLE_NAME    NOT NULL VARCHAR2(30)  
  14.  TABLESPACE_NAME        VARCHAR2(30)  
  15.  CLUSTER_NAME           VARCHAR2(30)  
  16.  IOT_NAME               VARCHAR2(30)  
  17.  STATUS                 VARCHAR2(8)  
  18.  PCT_FREE               NUMBER  
  19.  PCT_USED               NUMBER  
  20. ...  

    再将subobject_name的非空约束去掉。

SQL代码
  1. HELLODBA.COM>alter table t_test1 modify subobject_name null;  
  2.   
  3. Table altered.  

    我们通过以下语句查找t_test1中subobject_name不为table_name的数据:

SQL代码
  1. HELLODBA.COM>select t1.owner, t1.object_name, t1.subobject_name from t_test1 t1 where subobject_name not in (select table_name from t_test2 t2);  
  2.   
  3. 45135 rows selected.  
  4.   
  5.   
  6. Execution Plan  
  7. ----------------------------------------------------------  
  8. Plan hash value: 3538907136  
  9.   
  10. ------------------------------------------------------------------------------  
  11. | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |  
  12. ------------------------------------------------------------------------------  
  13. |   0 | SELECT STATEMENT   |         |  2379 | 76128 |    51   (0)| 00:00:52 |  
  14. |*  1 |  FILTER            |         |       |       |            |          |  
  15. |   2 |   TABLE ACCESS FULL| T_TEST1 | 47585 |  1487K|    45   (0)| 00:00:46 |  
  16. |*  3 |   TABLE ACCESS FULL| T_TEST2 |     1 |    18 |     6   (0)| 00:00:07 |  
  17. ------------------------------------------------------------------------------  
  18.   
  19. Predicate Information (identified by operation id):  
  20. ---------------------------------------------------  
  21.   
  22.    1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "T_TEST2" "T2" WHERE  
  23.               LNNVL("TABLE_NAME"<>:B1)))  
  24.    3 - filter(LNNVL("TABLE_NAME"<>:B1))  
  25.   
  26.   
  27. Statistics  
  28. ----------------------------------------------------------  
  29.         392  recursive calls  
  30.           0  db block gets  
  31.     2217674  consistent gets  
  32.           0  physical reads  
  33.           0  redo size  
  34.     2329590  bytes sent via SQL*Net to client  
  35.       33473  bytes received via SQL*Net from client  
  36.        3010  SQL*Net roundtrips to/from client  
  37.           5  sorts (memory)  
  38.           0  sorts (disk)  
  39.       45135  rows processed  

    可以看到,执行计划通过添加函数LNNVL和NOT EXISTS,对数据进行过滤得到结果,性能相当低。

    注意:当逻辑表达是中的操作数可能为空时,LNNVL函数可以判断出该表达式的结果。

    我们再把非空约束加上,

SQL代码
  1. HELLODBA.COM>alter table t_test1 modify subobject_name not null;  
  2.   
  3. Table altered.  
  4.   
  5. HELLODBA.COM>select /*+ordered*/t1.owner, t1.object_name, t1.subobject_name from t_test1 t1 where not exists (select 1 from t_test2 t2 where t1.subobject_name = t2.table_name);  
  6.   
  7. 45135 rows selected.  
  8.   
  9.   
  10. Execution Plan  
  11. ----------------------------------------------------------  
  12. Plan hash value: 3049160152  
  13.   
  14. ---------------------------------------------------------------------------------------  
  15. | Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |  
  16. ---------------------------------------------------------------------------------------  
  17. |   0 | SELECT STATEMENT    |         |     1 |    50 |       |   475   (1)| 00:07:56 |  
  18. |   1 |  MERGE JOIN ANTI    |         |     1 |    50 |       |   475   (1)| 00:07:56 |  
  19. |   2 |   SORT JOIN         |         | 47585 |  1487K|  4136K|   458   (1)| 00:07:39 |  
  20. |   3 |    TABLE ACCESS FULL| T_TEST1 | 47585 |  1487K|       |    45   (0)| 00:00:46 |  
  21. |*  4 |   SORT UNIQUE       |         |  2070 | 37260 |   120K|    17   (6)| 00:00:18 |  
  22. |   5 |    TABLE ACCESS FULL| T_TEST2 |  2070 | 37260 |       |     6   (0)| 00:00:07 |  
  23. ---------------------------------------------------------------------------------------  
  24.   
  25. Predicate Information (identified by operation id):  
  26. ---------------------------------------------------  
  27.   
  28.    4 - access("T1"."SUBOBJECT_NAME"="T2"."TABLE_NAME")  
  29.        filter("T1"."SUBOBJECT_NAME"="T2"."TABLE_NAME")  
  30.   
  31.   
  32. Statistics  
  33. ----------------------------------------------------------  
  34.          41  recursive calls  
  35.         141  db block gets  
  36.         882  consistent gets  
  37.        1432  physical reads  
  38.           0  redo size  
  39.     2050667  bytes sent via SQL*Net to client  
  40.       33473  bytes received via SQL*Net from client  
  41.        3010  SQL*Net roundtrips to/from client  
  42.           0  sorts (memory)  
  43.           2  sorts (disk)  
  44.       45135  rows processed  

    可以看到执行计划通过ANTI-JOIN获取我们需要的数据,性能大为改善。

    我们知道,对于空值的逻辑判断,只能通过IS NULL或IS NOT NULL进行判断,除此之外,一旦表达式中含有NULL值,结果始终为空。这也就是空值的存在不会影响JOIN或SEMI-JOIN的原因。

SQL代码
  1. HELLODBA.COM>select 1 from dual where null='';  
  2.   
  3. no rows selected  
  4.   
  5. HELLODBA.COM>select 1 from dual where null=null;  
  6.   
  7. no rows selected  
  8.   
  9. HELLODBA.COM>select 1 from dual where null is null;  
  10.   
  11.          1  
  12. ----------  
  13.          1  

    ANTI-JOIN,通过关联方法(NESTED-LOOP、MERGE、HASH)判断记录是否符合条件,一旦发现两边记录可以关联上,则判定不符合要求,可以放弃对一个数据集中的剩余数据的判断,因而能提高性能。而关联是同等价匹配(=)实现的,不适合空值数据。因此,关联字段可能存在空值时,无法采用ANTI-JOIN。

    注意:无论是否存在空值,NOT EXISTS都可以采用ANTI-JOIN,但是它的逻辑结果与NOT IN并不等价。在以下例子中,NOT EXISTS和NOT IN的结果不相同:

SQL代码
  1. HELLODBA.COM>alter table t_test1 modify subobject_name null;  
  2.   
  3. Table altered.  
  4.   
  5. HELLODBA.COM>update t_test1 set subobject_name=null where rownum <=10;  
  6.   
  7. 10 rows updated.  
  8.   
  9. HELLODBA.COM>select t1.owner, t1.object_name, t1.subobject_name from t_test1 t1 where subobject_name not in (select table_name from t_test2 t2);  
  10.   
  11. 45129 rows selected.  
  12.   
  13. Execution Plan  
  14. ----------------------------------------------------------  
  15. Plan hash value: 3538907136  
  16.   
  17. ------------------------------------------------------------------------------  
  18. | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |  
  19. ------------------------------------------------------------------------------  
  20. |   0 | SELECT STATEMENT   |         |  2379 | 76128 |    51   (0)| 00:00:52 |  
  21. |*  1 |  FILTER            |         |       |       |            |          |  
  22. |   2 |   TABLE ACCESS FULL| T_TEST1 | 47585 |  1487K|    45   (0)| 00:00:46 |  
  23. |*  3 |   TABLE ACCESS FULL| T_TEST2 |     1 |    18 |     6   (0)| 00:00:07 |  
  24. ------------------------------------------------------------------------------  
  25.   
  26. Predicate Information (identified by operation id):  
  27. ---------------------------------------------------  
  28.   
  29.    1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "T_TEST2" "T2" WHERE  
  30.               LNNVL("TABLE_NAME"<>:B1)))  
  31.    3 - filter(LNNVL("TABLE_NAME"<>:B1))  
  32.   
  33.   
  34. Statistics  
  35. ----------------------------------------------------------  
  36.         745  recursive calls  
  37.         216  db block gets  
  38.     2217413  consistent gets  
  39.          13  physical reads  
  40.           0  redo size  
  41.     2329442  bytes sent via SQL*Net to client  
  42.       33473  bytes received via SQL*Net from client  
  43.        3010  SQL*Net roundtrips to/from client  
  44.          26  sorts (memory)  
  45.           0  sorts (disk)  
  46.       45129  rows processed  
  47.   
  48. HELLODBA.COM>select t1.owner, t1.object_name, t1.subobject_name from t_test1 t1 where not exists (select 1 from t_test2 t2 where t1.subobject_name = t  
  49. 2.table_name);  
  50.   
  51. 45139 rows selected.  
  52.   
  53. Execution Plan  
  54. ----------------------------------------------------------  
  55. Plan hash value: 2383621862  
  56.   
  57. --------------------------------------------------------------------------------  
  58. | Id  | Operation            | Name    | Rows  | Bytes | Cost (%CPU)| Time     |  
  59. --------------------------------------------------------------------------------  
  60. |   0 | SELECT STATEMENT     |         |     1 |    50 |    52   (2)| 00:00:52 |  
  61. |*  1 |  HASH JOIN RIGHT ANTI|         |     1 |    50 |    52   (2)| 00:00:52 |  
  62. |   2 |   TABLE ACCESS FULL  | T_TEST2 |  2070 | 37260 |     6   (0)| 00:00:07 |  
  63. |   3 |   TABLE ACCESS FULL  | T_TEST1 | 47585 |  1487K|    45   (0)| 00:00:46 |  
  64. --------------------------------------------------------------------------------  
  65.   
  66. Predicate Information (identified by operation id):  
  67. ---------------------------------------------------  
  68.   
  69.    1 - access("T1"."SUBOBJECT_NAME"="T2"."TABLE_NAME")  
  70.   
  71.   
  72. Statistics  
  73. ----------------------------------------------------------  
  74.          49  recursive calls  
  75.         360  db block gets  
  76.        4130  consistent gets  
  77.           0  physical reads  
  78.           0  redo size  
  79.     2329713  bytes sent via SQL*Net to client  
  80.       33484  bytes received via SQL*Net from client  
  81.        3011  SQL*Net roundtrips to/from client  
  82.           2  sorts (memory)  
  83.           0  sorts (disk)  
  84.       45139  rows processed  
  85.   
  86. HELLODBA.COM>rollback;  
  87.   
  88. Rollback complete.  

    --- Fuyuncat ---

Top

Copyright ©2005,HelloDBA.Com 保留一切权利

申明
by fuyuncat