楼主: whf7907

请教个SQL优化的问题,高手们帮忙

[复制链接]
论坛徽章:
0
 楼主| 发表于 2009-12-30 11:42 | 显示全部楼层
SQL> select count(*) from t_terminal where  ENT_CODE='empRoot'
  2  /

  COUNT(*)
----------
      1364

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:20:05
发表于 2009-12-30 11:42 | 显示全部楼层
应该是试试t.alarm_type='1' 不是试试t.alarm_type="1"

使用道具 举报

回复
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-12-30 11:44 | 显示全部楼层
原帖由 whf7907 于 2009-12-30 11:42 发表
SQL> select count(*) from t_terminal where  ENT_CODE='empRoot'
  2  /

  COUNT(*)
----------
      1364


hoho ~ cbo评估错误~...

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:20:05
发表于 2009-12-30 11:48 | 显示全部楼层
原帖由 whf7907 于 2009-12-30 11:40 发表
表和索引刚分析过。


分析还得看看分析得对不对。 分析错了就会产生错误的执行计划。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-30 11:48 | 显示全部楼层
改为
t.alarm_type='1'的执行计划

SQL> select t.id,tt.term_name,t.device_id,t.speed,
  2   to_char(t.alarm_time,'yyyy-MM-dd hh24:mi:ss') alarm_time,tcase.max_speed
  3   /*+ use_hash(t, tcase.id) */ from t_area_locrecord t,t_terminal tt, t_speed_case tcase
  4   where
  5  tt.ent_code='empRoot'
  6  and tt.device_id is not null
  7  and t.ALARM_TIME>sysdate-1
  8  and t.speed>tcase.max_speed
  9  and t.device_id=tt.device_id
10  and t.alarm_type='1'
11  and t.case_id=tcase.id
12  /

Execution Plan
----------------------------------------------------------
Plan hash value: 1639185357

-------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                  | 56449 |  3803K| 88164   (1)| 00:17:38 |
|*  1 |  HASH JOIN                   |                  | 56449 |  3803K| 88164   (1)| 00:17:38 |
|   2 |   TABLE ACCESS FULL          | T_SPEED_CASE     |  2689 | 21512 |     7   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS BY INDEX ROWID| T_AREA_LOCRECORD | 14201 |   388K| 49699   (1)| 00:09:57 |
|   4 |    NESTED LOOPS              |                  |  1128K|    65M| 88143   (1)| 00:17:38 |
|*  5 |     TABLE ACCESS FULL        | T_TERMINAL       |    80 |  2640 |   504   (2)| 00:00:07 |
|*  6 |     INDEX RANGE SCAN         | INDEX_DEVICEID   | 78981 |       |   480   (1)| 00:00:06 |
-------------------------------------------------------------------------------------------------

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

   1 - access("T"."CASE_ID"="TCASE"."ID")
       filter("T"."SPEED">"TCASE"."MAX_SPEED")
   3 - filter("T"."ALARM_TYPE"='1' AND "T"."ALARM_TIME">SYSDATE@!-1)
   5 - filter("TT"."ENT_CODE"='empRoot')
   6 - access("T"."DEVICE_ID"="TT"."DEVICE_ID")

使用道具 举报

回复
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-12-30 11:49 | 显示全部楼层
收集ENT_CODE列的直方图看看

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-30 11:55 | 显示全部楼层
不好意思。如何收集列的直方图信息?

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-30 12:19 | 显示全部楼层
不好意思。原来没有分析t_terminal,只分析了大表,这个表没分析,分析完后,
|*  2 |   TABLE ACCESS FULL | T_TERMINAL       |  1302 | 46872 |   504   (2)| 00
:00:07 |
应该对了

SQL> l
  1  select t.id,tt.term_name,t.device_id,t.speed,
  2   to_char(t.alarm_time,'yyyy-MM-dd hh24:mi:ss') alarm_time,tcase.max_speed
  3   /*+ use_hash(t, tcase.id) */ from t_area_locrecord t,t_terminal tt, t_speed_case tcase
  4   where
  5  tt.ent_code='empRoot'
  6  and tt.device_id is not null
  7  and t.ALARM_TIME>sysdate-1
  8  and t.speed>tcase.max_speed
  9  and t.device_id=tt.device_id
10  and t.alarm_type='1'
11* and t.case_id=tcase.id
SQL> /

Execution Plan
----------------------------------------------------------
Plan hash value: 3527672269

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

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

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

|   0 | SELECT STATEMENT    |                  |   902K|    61M|   315K  (3)| 01
:03:06 |

|*  1 |  HASH JOIN          |                  |   902K|    61M|   315K  (3)| 01
:03:06 |

|*  2 |   TABLE ACCESS FULL | T_TERMINAL       |  1302 | 46872 |   504   (2)| 00
:00:07 |

|*  3 |   HASH JOIN         |                  |   902K|    30M|   314K  (3)| 01
:03:00 |

|   4 |    TABLE ACCESS FULL| T_SPEED_CASE     |  2689 | 21512 |     7   (0)| 00
:00:01 |

|*  5 |    TABLE ACCESS FULL| T_AREA_LOCRECORD |    18M|   481M|   314K  (3)| 01
:02:58 |

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


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

   1 - access("T"."DEVICE_ID"="TT"."DEVICE_ID")
   2 - filter("TT"."ENT_CODE"='empRoot')
   3 - access("T"."CASE_ID"="TCASE"."ID")
       filter("T"."SPEED">"TCASE"."MAX_SPEED")
   5 - filter("T"."ALARM_TYPE"='1' AND "T"."ALARM_TIME">SYSDATE@!-1)

Note
-----
   - 'PLAN_TABLE' is old version

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:20:05
发表于 2009-12-30 13:38 | 显示全部楼层
从计划看。性能问题在这里:filter("T"."ALARM_TYPE"='1' AND "T"."ALARM_TIME">SYSDATE@!-1)

5|TABLE ACCESS FULL| T_AREA_LOCRECORD 返回约20%的数据, 加索引可能没有什么用了。
4|TABLE ACCESS FULL| T_SPEED_CASE 返回全部数据。不需要索引
3 |   HASH JOIN         |                  |   902K|    30M| 过滤了一半由第5步反回的数据
|*  2 |   TABLE ACCESS FULL | T_TERMINAL       |  1302 | 返回1302行,这个表有16万行,但这个地方没有用到索引,很奇怪,应该再分析下表的tt.ent_code列。


如果有可能的话。 试试对 T_AREA_LOCRECORD 按"T"."ALARM_TIME分区试试

你这个是不是测试用的表?? 怎么t.ALARM_TIME>sysdate-1 会返回一个这么大的表的20%的数据?

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-30 13:50 | 显示全部楼层
目前没有分区, 准备改成分区表的。

使用道具 举报

回复

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

本版积分规则 发表回复

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