楼主: xiaodong_1567

我有这样一个索引,什么时候会用上呢

[复制链接]
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
11#
发表于 2008-4-14 09:32 | 只看该作者
set autotrace traceonly explain
select /*+ index (t processed_flag_idx) */ *
from t where ( case temporary when 'N' then 'N' end ) = 'N';
set autotrace off

执行计划看看

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
25
生肖徽章2007版:龙
日期:2008-05-06 11:07:48咸鸭蛋
日期:2011-10-19 10:09:12ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2008-4-14 09:50 | 只看该作者
原帖由 xiaodong_1567 于 2008-4-13 12:50 发表




set autotrace traceonly explain
select /*+ index (t processed_flag_idx) */ *
from t where temporary = 'N';
set autotrace off

原代码上条件加了


select /*+ index (s processed_flag_idx) */ *
from t s where temporary = 'N';
set autotrace off
试试

使用道具 举报

回复
论坛徽章:
0
13#
发表于 2008-4-14 11:23 | 只看该作者
SQL> create table AA as select * from dba_objects;

Table created

SQL> commit;

Commit complete

SQL> select count(*) , temporary from AA group by temporary;

  COUNT(*) TEMPORARY
---------- ---------
       103 Y
     50221 N

SQL> create index ind_AA on AA ( case temporary when 'Y' then 'Y' end );

Index created

[php]
SQL> explain plan for
  2  select * from AA where temporary='Y';

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3285055242
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   124 | 11532 |   157   (3)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| AA   |   124 | 11532 |   157   (3)| 00:00:02 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("TEMPORARY"='Y')

13 rows selected

SQL> explain plan for
  2  select  * from AA where (CASE TEMPORARY WHEN 'Y' THEN 'Y' END)='Y';

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1326281477
--------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |   503 | 46779 |    24   (0)| 00:0
|   1 |  TABLE ACCESS BY INDEX ROWID| AA     |   503 | 46779 |    24   (0)| 00:0
|*  2 |   INDEX RANGE SCAN          | IND_AA |   103 |       |     1   (0)| 00:0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access(CASE "TEMPORARY" WHEN 'Y' THEN 'Y' END ='Y')

14 rows selected

[/php]

函数索引~条件要加函数~
你索引建错了,case在建立索引的时候用法用问题~

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
14#
发表于 2008-4-14 15:25 | 只看该作者
原帖由 zergduan_TT 于 2008-4-14 11:23 发表
SQL> create table AA as select * from dba_objects;


函数索引~条件要加函数~
你索引建错了,case在建立索引的时候用法用问题~


顶. 不知道楼主为什么要建这么一个奇怪的函数索引, 这个问题用普通索引就可以解决了.

使用道具 举报

回复
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
15#
 楼主| 发表于 2008-4-14 17:04 | 只看该作者
原帖由 foxmile 于 2008-4-14 09:50 发表


select /*+ index (s processed_flag_idx) */ *
from t s where temporary = 'N';
set autotrace off
试试


SQL> select /*+ index (s processed_flag_idx) */ *
  2  from t s where temporary = 'N';

执行计划
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   705 | 99405 |  3271   (1)| 00:00:40 |
|*  1 |  TABLE ACCESS FULL| T    |   705 | 99405 |  3271   (1)| 00:00:40 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("TEMPORARY"='N')

Note
-----
   - dynamic sampling used for this statement

还是不行的

使用道具 举报

回复
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
16#
 楼主| 发表于 2008-4-14 17:09 | 只看该作者
回zergduan_TT

SQL> create table AA as select * from dba_objects;

表已创建。


SQL> select count(*) , temporary from AA group by temporary;


执行计划
----------------------------------------------------------
Plan hash value: 2807095694

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 51863 |   101K|   158   (3)| 00:00:02 |
|   1 |  HASH GROUP BY     |      | 51863 |   101K|   158   (3)| 00:00:02 |
|   2 |   TABLE ACCESS FULL| AA   | 51863 |   101K|   155   (1)| 00:00:02 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement


统计信息
----------------------------------------------------------
         48  recursive calls
          0  db block gets
        758  consistent gets
        678  physical reads
          0  redo size
        512  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed

SQL> create index ind_AA on AA ( case temporary when 'Y' then 'Y' end );

索引已创建。

SQL> set autotrace traceonly explain
SQL> select * from AA where temporary='Y';

执行计划
----------------------------------------------------------
Plan hash value: 3285055242

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    78 | 13806 |   155   (1)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| AA   |    78 | 13806 |   155   (1)| 00:00:02 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("TEMPORARY"='Y')

Note
-----
   - dynamic sampling used for this statement

SQL> set autotrace off

你的方法我这也行不通啊

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

使用道具 举报

回复
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
17#
 楼主| 发表于 2008-4-14 17:10 | 只看该作者
SQL> select count(*) , temporary from AA group by temporary;

  COUNT(*) T
---------- -
        96 Y
     49219 N

使用道具 举报

回复
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
18#
 楼主| 发表于 2008-4-14 17:12 | 只看该作者
原帖由 mihawk 于 2008-4-14 15:25 发表


顶. 不知道楼主为什么要建这么一个奇怪的函数索引, 这个问题用普通索引就可以解决了.


是个试验,但实际中也有这种情况
如:重点为尚未处理的订单建索引

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
19#
发表于 2008-4-14 17:59 | 只看该作者
原帖由 xiaodong_1567 于 2008-4-14 17:09 发表
回zergduan_TT

SQL> create table AA as select * from dba_objects;

表已创建。


SQL> select count(*) , temporary from AA group by temporary;


执行计划
----------------------------------------------------------
Plan hash value: 2807095694

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 51863 |   101K|   158   (3)| 00:00:02 |
|   1 |  HASH GROUP BY     |      | 51863 |   101K|   158   (3)| 00:00:02 |
|   2 |   TABLE ACCESS FULL| AA   | 51863 |   101K|   155   (1)| 00:00:02 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement


统计信息
----------------------------------------------------------
         48  recursive calls
          0  db block gets
        758  consistent gets
        678  physical reads
          0  redo size
        512  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed

SQL> create index ind_AA on AA ( case temporary when 'Y' then 'Y' end );

索引已创建。

SQL> set autotrace traceonly explain
SQL> select * from AA where temporary='Y';

执行计划
----------------------------------------------------------
Plan hash value: 3285055242

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    78 | 13806 |   155   (1)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| AA   |    78 | 13806 |   155   (1)| 00:00:02 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("TEMPORARY"='Y')

Note
-----
   - dynamic sampling used for this statement

SQL> set autotrace off

你的方法我这也行不通啊

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod


我那个只是个试验,说明你这么建立索引,是一个函数索引,如果你查询的语句条件中没有使用这个函数,是不可能使用索引的,hints也没用。

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
20#
发表于 2008-4-14 18:04 | 只看该作者
我听说这种case语句建立索引是为了保证唯一性而不是用来使用的~
比如table A有3个字段 a , b, c
如果想保证a 为Null时 b唯一且 a not null时 c唯一,可以用case来建立唯一索引。
记得在某人的blog上看到过~

使用道具 举报

回复

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

本版积分规则 发表回复

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