测试如下:
SQL> create table test(a char(1),b long) tablespace users;
Table created.
SQL> insert into test values('1','aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
1 row created.
SQL> commit;
Commit complete.
SQL> exec dbms_stats.gather_table_stats(user,'test',cascade=>true);
PL/SQL procedure successfully completed.
SQL> select table_name,num_rows,avg_row_len from user_tables where table_name='TEST';
TABLE_NAME NUM_ROWS AVG_ROW_LEN
------------------------------ ---------- -----------
TEST 1 2
SQL> drop table test;
Table dropped.
SQL> create table test(a char(1),b long) tablespace users;
Table created.
SQL> insert into test values('1','aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
1 row created.
SQL> commit;
Commit complete.
SQL> analyze table test compute statistics;
Table analyzed.
SQL> select table_name,num_rows,avg_row_len from user_tables where table_name='TEST';
TABLE_NAME NUM_ROWS AVG_ROW_LEN
------------------------------ ---------- -----------
TEST 1 89
显然,analyze命令收集long字段的长度,而dbms_stats没有收集,而对于clob字段,dbms_stats包却又收集了其长度信息:
SQL> create table test(a char(1),b clob) tablespace users;
Table created.
SQL> insert into test values('1','aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
1 row created.
SQL> commit;
Commit complete.
SQL> exec dbms_stats.gather_table_stats(user,'test',cascade=>true);
PL/SQL procedure successfully completed.
SQL> select table_name,num_rows,avg_row_len from user_tables where table_name='TEST';
TABLE_NAME NUM_ROWS AVG_ROW_LEN
------------------------------ ---------- -----------
TEST 1 188
这是否意味着oracle彻底不想使用long类型了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-664476/ ,如需转载,请注明出处,否则将追究法律责任。