楼主: www.wwf.co

在查询条件中有两个索引列时,RBO将如何选择?

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2005-1-20 09:40 | 只看该作者
ANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
PL/SQL Release 9.2.0.3.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.3.0 - Production
NLSRTL Version 9.2.0.3.0 - Production

alibaba@OCN>create table t as select * from dba_objects;

Table created.

alibaba@OCN>desc t
Name                                                  Null?    Type
----------------------------------------------------- -------- ------------------------------------
OWNER                                                          VARCHAR2(30)
OBJECT_NAME                                                    VARCHAR2(128)
SUBOBJECT_NAME                                                 VARCHAR2(30)
OBJECT_ID                                                      NUMBER
DATA_OBJECT_ID                                                 NUMBER
OBJECT_TYPE                                                    VARCHAR2(18)
CREATED                                                        DATE
LAST_DDL_TIME                                                  DATE
TIMESTAMP                                                      VARCHAR2(19)
STATUS                                                         VARCHAR2(7)
TEMPORARY                                                      VARCHAR2(1)
GENERATED                                                      VARCHAR2(1)
SECONDARY                                                      VARCHAR2(1)

alibaba@OCN>create index  t_created on t(created);

Index created.

alibaba@OCN>create index t_last_ddl_time on t(last_ddl_time);

Index created.

alibaba@OCN>set autotrace on
alibaba@OCN>set  autotrace  traceonly
alibaba@OCN>select * from t where created = sysdate and  last_ddl_time = sysdate;

no rows selected


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T'
   2    1     AND-EQUAL
   3    2       INDEX (RANGE SCAN) OF 'T_CREATED' (NON-UNIQUE)
   4    2       INDEX (RANGE SCAN) OF 'T_LAST_DDL_TIME' (NON-UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          1  physical reads
          0  redo size
        918  bytes sent via SQL*Net to client
        368  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

alibaba@OCN>select * from t where created > sysdate and  last_ddl_time > sysdate;

no rows selected


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T'
   2    1     INDEX (RANGE SCAN) OF 'T_LAST_DDL_TIME' (NON-UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          1  physical reads
          0  redo size
        918  bytes sent via SQL*Net to client
        368  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

alibaba@OCN>drop index  t_created;

Index dropped.

alibaba@OCN>create index  t_created on t(created);

Index created.

alibaba@OCN>select * from t where created > sysdate and  last_ddl_time > sysdate;

no rows selected


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T'
   2    1     INDEX (RANGE SCAN) OF 'T_CREATED' (NON-UNIQUE)




Statistics
----------------------------------------------------------
         29  recursive calls
          0  db block gets
          5  consistent gets
          1  physical reads
          0  redo size
        918  bytes sent via SQL*Net to client
        368  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

alibaba@OCN>

使用道具 举报

回复
论坛徽章:
6
会员2006贡献徽章
日期:2006-04-17 13:46:34参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
12#
 楼主| 发表于 2005-1-20 09:53 | 只看该作者
今天早上到后写了一个试验,环境是我的笔记本,9.2.0.1版本数据库
一个试验,推翻了biti和xzh2000的设想:

请看:

SQL> desc a
名称                                      是否为空? 类型
----------------------------------------- -------- ---------------------

OWNER                                              VARCHAR2(30)
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
OBJECT_ID                                          NUMBER
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(18)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)

SQL> select index_name from user_indexes where table_name = 'A';

INDEX_NAME
------------------------------
IND_OBJECTID_A

IND_OBJECTID_A 是object_id列上的索引。再新建一个索引:
SQL> create index ind_createdate_a on a(created) tablespace
  2  index_test;

索引已创建。

SQL> set timing on
SQL> select object_name from a where a.object_id = 30308 and
  2  created between to_date('2005-01-10 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
  3  and to_date('2005-01-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss');

已选择96行。

已用时间:  00: 00: 01.02

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'A'
   2    1     INDEX (RANGE SCAN) OF 'IND_OBJECTID_A' (NON-UNIQUE)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        106  consistent gets
         98  physical reads
          0  redo size
       1637  bytes sent via SQL*Net to client
        569  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         96  rows processed

可以看出,执行计划使用的仍然是 object_id 字段上的索引 IND_OBJECTID_A。

不过,我尝试这样的查询:

SQL> select object_name from a where a.object_id = 30308 and
  2  created = to_date('2005-01-16 10:46:46', 'yyyy-mm-dd hh24:mi:ss');

已选择96行。

已用时间:  00: 00: 00.01

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'A'
   2    1     AND-EQUAL
   3    2       INDEX (RANGE SCAN) OF 'IND_OBJECTID_A' (NON-UNIQUE)
   4    2       INDEX (RANGE SCAN) OF 'IND_CREATEDATE_A' (NON-UNIQUE)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        315  consistent gets
          2  physical reads
          0  redo size
       1637  bytes sent via SQL*Net to client
        569  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         96  rows processed

SQL>

这次,执行计划使用了两个索引,并且使用了AND-EQUAL连接方法。

使用道具 举报

回复
论坛徽章:
6
会员2006贡献徽章
日期:2006-04-17 13:46:34参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
13#
 楼主| 发表于 2005-1-20 09:58 | 只看该作者
biti,你的试验过程我刚刚读过!在读你的试验之前,我把自己的试验过程帖了出来。
我会到楼下重复你的试验。
不过,我现在不明白的是. user_indexes这样的视图中,并没有索引创建的时间信息。
不知优化器如何根据创建时间来选择。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
14#
发表于 2005-1-20 09:59 | 只看该作者
你可以看看我上面的例子,一要避免  AND-EQUAL  ,二要在条件界定上必须对等。不能一个是 等于 另一个是 大于 这样的条件。

使用道具 举报

回复
论坛徽章:
6
会员2006贡献徽章
日期:2006-04-17 13:46:34参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
15#
 楼主| 发表于 2005-1-20 10:00 | 只看该作者
当然,在没有试验结果证明之前,我并不相信优化器是根据创建时间选择的。我这就下楼去试验!

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
16#
发表于 2005-1-20 10:01 | 只看该作者
最初由 www.wwf.co 发布
[B]当然,在没有试验结果证明之前,我并不相信优化器是根据创建时间选择的。我这就下楼去试验! [/B]


在user_objects中可以看到对象创建的时间的。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
17#
发表于 2005-1-20 10:13 | 只看该作者
实际上,没有放之四海皆准的真理,都是在有限条件下成立的

在出现一个现象的时候,能应用已知知识去解释现象,就成。

使用道具 举报

回复
论坛徽章:
6
会员2006贡献徽章
日期:2006-04-17 13:46:34参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
18#
 楼主| 发表于 2005-1-20 11:52 | 只看该作者
刚才试验了以下,按照biti的试验,确实是和时间先后顺序有关。

使用道具 举报

回复
论坛徽章:
60
2007年度最佳版主
日期:2008-04-03 16:46:15现任管理团队成员
日期:2011-05-07 01:45:08双黄蛋
日期:2011-06-15 17:03:34ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
19#
发表于 2005-1-20 12:15 | 只看该作者
这个Oracle有记载的,

后创建的索引优先

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
20#
发表于 2005-1-20 13:34 | 只看该作者
推荐这篇文章。

第4页蓝色部分,讲到这个问题

searchintelligencecbo.doc

87 KB, 下载次数: 31

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表