关于组合列的索引问题

[复制链接]
查看11 | 回复6 | 2006-4-17 13:46:34 | 显示全部楼层 |阅读模式
创建多列组合索引中列的顺序有没有要求,理由是什么?
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
我记得是,如果建立(A,B)的组合索引那么
where a=? and b=?可以走索引
where a=?可以走索引
where b=?不走索引
不好好像后面的版本有所改变
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
有,应该把最常用的字段放在组合索引的最前面
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
我记得是,如果建立(A,B)的组合索引那么
where b=? and a=?可以走索引吗?
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
最初由 zy_ly 发布
[B]我记得是,如果建立(A,B)的组合索引那么
where b=? and a=?可以走索引吗? [/B]

基于COST可以
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
最初由 mychary 发布
[B]
基于COST可以 [/B]

[php]
SQL> truncate table t;
Table truncated.
SQL> insert into t(id ,name) values(1 , 'test');
1 row created.
SQL> insert into t(id ,name) values(2 , 'test1');
1 row created.
SQL> insert into t(id ,name) values(3 , 'test2');
1 row created.
SQL> commit;
Commit complete.
SQL> create index t_idx on t (id , name);
Index created.
SQL> set autotrace on explain
SQL> select * from t where id=1 and name='test';
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 TABLE ACCESS (BY INDEX ROWID) OF 'T'
21 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE)

SQL> select * from t where name='test' and id =1;
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 TABLE ACCESS (BY INDEX ROWID) OF 'T'
21 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE)

SQL> select * from t where id=1 or name='test';
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 TABLE ACCESS (FULL) OF 'T'

SQL> select * from t where name='test' or id =1;
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 TABLE ACCESS (FULL) OF 'T'

SQL> analyze table t compute statistics;
Table analyzed.
SQL> select * from t where id=1 and name='test';
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=12)
10 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=2 Card=1 Bytes=

12)
21 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=1 Card=

1)


SQL> select * from t where name='test' and id =1;
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=12)
10 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=2 Card=1 Bytes=

12)
21 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=1 Card=

1)


SQL> select * from t where id=1 or name='test';
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=2 Bytes=24)
10 CONCATENATION
21 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=2 Card=1 Byte

s=12)
32 INDEX (SKIP SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=1 Card

=1)
41 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=2 Card=1 Byte

s=12)
54 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=1 Car

d=1)


SQL> select * from t where name='test' or id =1;
ID NAME
COL
---------- -------------------- --------------------
1 test

Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=2 Bytes=24)
10 CONCATENATION
21 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=4 Card=1 Byte

s=12)
32 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3 Car

d=1)
41 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=4 Card=1 Byte

s=12)
54 INDEX (SKIP SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3 Card

=1)
'''''''''''''''''''''''''
SQL>
[/php]
有疑惑就做试验!
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
最初由 warehouse 发布
[B]
有疑惑就做试验! [/B]

经典。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行