最初由 leaner 发布
[B]哦 我在查询前没有analyze table 。analyze table 后就可以用了。
还有个小问题,能不能告诉我,同样没有analyze table ,为什么普通的索引立即会被使用呢?
有 REVERSE的:
SQL> CREATE TABLE TESTTABLE
2 (
3 ID NUMBER(10),
4 TEXT VARCHAR2(20 BYTE)
5 );
表已创建。
SQL>
SQL> CREATE UNIQUE INDEX PK_TESTTABLE
2 ON TESTTABLE(ID)
3 TABLESPACE INDX REVERSE;
索引已创建。
SQL>
SQL> ALTER TABLE TESTTABLE
2 ADD CONSTRAINT PK_TESTTABLE
3 PRIMARY KEY (ID);
表已更改。
SQL> insert into testtable values(1,'111111111111');
已创建 1 行。
SQL> insert into testtable values(2,'2222222222222');
已创建 1 行。
SQL> insert into testtable values(3,'33333333333333');
已创建 1 行。
SQL> insert into testtable values(4,'444444444444444');
已创建 1 行。
SQL> insert into testtable values(5,'5555555555555555');
已创建 1 行。
SQL> set autotrace on
SQL> select * from testtable where id=2;
ID TEXT
---------- --------------------
2 2222222222222
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'TESTTABLE'
普通的索引:
SQL> set autotrace off;
SQL> drop table testtable;
表已丢弃。
SQL> CREATE TABLE TESTTABLE
2 (
3 ID NUMBER(10),
4 TEXT VARCHAR2(20 BYTE)
5 );
表已创建。
SQL>
SQL> CREATE UNIQUE INDEX PK_TESTTABLE
2 ON TESTTABLE(ID)
3 TABLESPACE INDX;
索引已创建。
SQL>
SQL> ALTER TABLE TESTTABLE
2 ADD CONSTRAINT PK_TESTTABLE
3 PRIMARY KEY (ID);
表已更改。
SQL> insert into testtable values(1,'111111111111');
已创建 1 行。
SQL> insert into testtable values(2,'2222222222222');
已创建 1 行。
SQL> insert into testtable values(3,'33333333333333');
已创建 1 行。
SQL> insert into testtable values(4,'444444444444444');
已创建 1 行。
SQL> insert into testtable values(5,'5555555555555555');
已创建 1 行。
SQL> set autotrace on
SQL> select * from testtable where id=2;
ID TEXT
---------- --------------------
2 2222222222222
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TESTTABLE'
2 1 INDEX (UNIQUE SCAN) OF 'PK_TESTTABLE' (UNIQUE) [/B]