SQL> show parameter statistics_level
NAME TYPE VALUE
------------------------------------ ----------- -------------
statistics_level string TYPICAL
该参数有三个值:(默认值)typical,all,basic
其中:
typical:允许收集正常调整所需的所有统计信息,同时不会收集对性能有不良影响的统计信息集合。
all:收集与sql语句执行相关的,及其详细的统计信息。如果要进行高级的sql语句调整,那么可以使用all级别,不过在收集信息时会导致性能稍有退化。
basic:禁用收集所有统计信息,并且不存在可评估的性能优势。
该初始化参数是动态参数,可以使用ALTER SESSION或ALTER SYSTEM命令进行修改:
alter session/system set statistics_level=typical|all|basic
————————————————
OMem:当前操作完成所有内存工作区(Work Aera)操作所总共使用私有内存(PGA)中工作区的大小, 这个数据是由优化器统计数据以及前一次执行的性能数据估算得出的 1Mem:当工作区大小无法满足操作所需的大小时,需要将部分数据写入临时磁盘空间中(如果仅需要写入一次就可以完成操作,就称一次通过,One-Pass;否则为多次通过,Multi_Pass).该列数据为语句最后一次执行中,单次写磁盘所需要的内存大小,这个由优化器统计数据以及前一次执行的性能数据估算得出的 Used-Mem:语句最后一次执行中,当前操作所使用的内存工作区大小,括号里面为(发生磁盘交换的次数,1次即为One-Pass,大于1次则为Multi_Pass,如果没有使用磁盘,则显示OPTIMAL) |
Oracle插入记录的顺序是否是读取的顺序?
通过一个简单的实验验证:
SQL> create table t
( x int,
a char(2000) default 'x',
b char(2000) default 'x',
c char(2000) default 'x');
Table created.
SQL> insert into t (x) values ( 1 );
1 row created.
SQL> insert into t (x) values ( 2);
1 row created.
SQL> insert into t (x) values ( 3);
1 row created.
SQL> commit;
Commit complete.
SQL> select x, rownum, rowid from t;
X ROWNUM ROWID
---------- ---------- ------------------
3 1 AAAOXNAAHAAAAasAAA
1 2 AAAOXNAAHAAAAavAAA
2 3 AAAOXNAAHAAAAawAAA
SQL> delete from t where x = 2;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select x, rownum, rowid from t;
X ROWNUM ROWID
---------- ---------- ------------------
3 1 AAAOXNAAHAAAAasAAA
1 2 AAAOXNAAHAAAAavAAA
SQL> insert into t (x) values ( 4 );
1 row created.
SQL> select x, rownum, rowid from t;
X ROWNUM ROWID
---------- ---------- ------------------
3 1 AAAOXNAAHAAAAasAAA
1 2 AAAOXNAAHAAAAavAAA
4 3 AAAOXNAAHAAAAawAAA
insert into t (x) values ( 5);
SQL> select x, rownum, rowid from t;
X ROWNUM ROWID
---------- ---------- ------------------
3 1 AAAOXNAAHAAAAasAAA
5 2 AAAOXNAAHAAAAatAAA
1 3 AAAOXNAAHAAAAavAAA
4 4 AAAOXNAAHAAAAawAAA
SQL> insert into t (x) values ( 10);
1 row created.
SQL> select x, rownum, rowid from t;
X ROWNUM ROWID
---------- ---------- ------------------
3 1 AAAOXNAAHAAAAasAAA
5 2 AAAOXNAAHAAAAatAAA
10 3 AAAOXNAAHAAAAauAAA
1 4 AAAOXNAAHAAAAavAAA
4 5 AAAOXNAAHAAAAawAAA
可见Oracle读取时按照记录的ROWID默认升序排列的,Oracle是一种堆表(默认),堆的意思就是杂乱无章的,插入数据时是根据内部算法,找到可用的数据块,一般出于效率的考虑,不采用原来的空间,用逻辑块的新空间,读取的顺序与COMMIT也没有直接关系,所以要排序,最好用ORDER BY。
ROWID是Oracle自动为每行记录分配的一个唯一标识,插入时是由Oracle根据内部算法,找到可以存放的块,然后再将数据放入其中,因此你存入1,2,3,未必就是按顺序插入的,应该说是随机的,所以读的时候若关注顺序,则建议使用ORDER BY显性排序,这样才能达到顺序读取的目的了。
————————————————