12
返回列表 发新帖
楼主: fangxinba

sql优化问题,谢谢

[复制链接]
论坛徽章:
7
奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-23 14:49:16生肖徽章2007版:兔
日期:2008-10-06 17:32:12奥运会纪念徽章:跳水
日期:2008-10-24 13:09:39生肖徽章2007版:兔
日期:2008-11-11 08:20:05生肖徽章2007版:龙
日期:2009-05-02 12:09:05生肖徽章2007版:狗
日期:2009-08-19 16:52:22祖国60周年纪念徽章
日期:2009-10-09 08:28:00
发表于 2009-8-31 14:13 | 显示全部楼层
原帖由 ZALBB 于 2009-8-31 13:58 发表
(a,1); 用单引号把1引起来,否,低版本分析该索引时,很容易遇上BUG。


技术

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:跆拳道
日期:2008-08-28 12:23:10奥运会纪念徽章:棒球
日期:2008-09-02 11:35:20
发表于 2009-8-31 14:16 | 显示全部楼层
原帖由 ZALBB 于 2009-8-31 13:42 发表


建个索引,索引字段为:(RECEIVE_DT,'1');



这样建立对select t.*, t.rowid from te1234 t where t.a>20这种语句就没用了。



  1. SQL> select t.*, t.rowid from te1234 t
  2.   2  where t.a is null;

  3. 执行计划
  4. ----------------------------------------------------------
  5. Plan hash value: 3547170523

  6. --------------------------------------------------------------------------------
  7. --------

  8. | Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Ti
  9. me     |

  10. --------------------------------------------------------------------------------
  11. --------

  12. |   0 | SELECT STATEMENT            |          |   320 | 12160 |    23   (0)| 00
  13. :00:01 |

  14. |   1 |  TABLE ACCESS BY INDEX ROWID| TE1234   |   320 | 12160 |    23   (0)| 00
  15. :00:01 |

  16. |*  2 |   INDEX RANGE SCAN          | TE_IND3C |  2667 |       |     8   (0)| 00
  17. :00:01 |

  18. --------------------------------------------------------------------------------
  19. --------


  20. Predicate Information (identified by operation id):
  21. ---------------------------------------------------

  22.    2 - access("T"."A" IS NULL)

  23. Note
  24. -----
  25.    - dynamic sampling used for this statement

  26. SQL> select t.*, t.rowid from te1234 t where t.a>20;

  27. 执行计划
  28. ----------------------------------------------------------
  29. Plan hash value: 615702579

  30. ----------------------------------------------------------------------------
  31. | Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
  32. ----------------------------------------------------------------------------
  33. |   0 | SELECT STATEMENT  |        | 53016 |  1967K|    30   (7)| 00:00:01 |
  34. |*  1 |  TABLE ACCESS FULL| TE1234 | 53016 |  1967K|    30   (7)| 00:00:01 |
  35. ----------------------------------------------------------------------------

  36. Predicate Information (identified by operation id):
  37. ---------------------------------------------------

  38.    1 - filter("T"."A">20)

  39. Note
  40. -----
  41.    - dynamic sampling used for this statement
复制代码

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-8-31 14:23 | 显示全部楼层

这与此索引无关,建普通索引,照样是这结果。

原帖由 grwdpy 于 2009-8-31 14:16 发表



这样建立对select t.*, t.rowid from te1234 t where t.a>20这种语句就没用了。



SQL> select t.*, t.rowid from te1234 t
  2  where t.a is null;

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

--------------------------------------------------------------------------------
--------

| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Ti
me     |

--------------------------------------------------------------------------------
--------

|   0 | SELECT STATEMENT            |          |   320 | 12160 |    23   (0)| 00
:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| TE1234   |   320 | 12160 |    23   (0)| 00
:00:01 |

|*  2 |   INDEX RANGE SCAN          | TE_IND3C |  2667 |       |     8   (0)| 00
:00:01 |

--------------------------------------------------------------------------------
--------


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

   2 - access("T"."A" IS NULL)

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

SQL> select t.*, t.rowid from te1234 t where t.a>20;

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

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        | 53016 |  1967K|    30   (7)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TE1234 | 53016 |  1967K|    30   (7)| 00:00:01 |
----------------------------------------------------------------------------

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

   1 - filter("T"."A">20)

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




SCOTT@ncdb>create table test1234 as select * from dba_objects;

Table created.

Elapsed: 00:00:01.65
SCOTT@ncdb>update test1234 set object_id = null where rownum <= 10;

10 rows updated.

Elapsed: 00:00:00.04
SCOTT@ncdb>commit;

Commit complete.

Elapsed: 00:00:00.00
SCOTT@ncdb>create index idx_test1234_01 on test1234(object_id,'1');

Index created.

Elapsed: 00:00:00.40
SCOTT@ncdb>exec dbms_stats.gather_table_stats('SCOTT','TEST1234');

PL/SQL procedure successfully completed.

Elapsed: 00:00:03.15
SCOTT@ncdb>explain plan for
  2  select * from test1234 where object_id is null;

Explained.

Elapsed: 00:00:00.09
SCOTT@ncdb>select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4116437784

-----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |    38 |  3572 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST1234        |    38 |  3572 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TEST1234_01 |    38 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

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

   2 - access("OBJECT_ID" IS NULL)

14 rows selected.

Elapsed: 00:00:00.87
SCOTT@ncdb>explain plan for
  2  select * from test1234 where object_id > 60000;

Explained.

Elapsed: 00:00:00.00
SCOTT@ncdb>select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4202577903

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          | 56174 |  5156K|   245   (4)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| TEST1234 | 56174 |  5156K|   245   (4)| 00:00:02 |
------------------------------------------------------------------------------

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

   1 - filter("OBJECT_ID">60000)

13 rows selected.

Elapsed: 00:00:00.04
SCOTT@ncdb>select max(object_id) from test1234;

MAX(OBJECT_ID)
--------------
        649578

Elapsed: 00:00:00.01
SCOTT@ncdb>explain plan for
  2  select * from test1234 where object_id > 649570;

Explained.

Elapsed: 00:00:00.01
SCOTT@ncdb>select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4116437784

-----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |     1 |    94 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST1234        |     1 |    94 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TEST1234_01 |     1 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

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

   2 - access("OBJECT_ID">649570 AND "OBJECT_ID" IS NOT NULL)

14 rows selected.

Elapsed: 00:00:00.04
SCOTT@ncdb>select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production

5 rows selected.

Elapsed: 00:00:00.06

使用道具 举报

回复
认证徽章
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
发表于 2009-8-31 14:47 | 显示全部楼层
实际上要看你需不需要 RECEIVE_DT 上的索引做其他query用途,如果需要,就用复合索引(RECEIVE_DT ,'a'),一举两得。
如果不需要,那么做函数索引case when RECEIVE_DT is null then 1 else null end;, ,能够使index的size很小~

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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