查看: 8622|回复: 55

[性能调整] 请教SQL优化

[复制链接]
论坛徽章:
0
发表于 2010-3-3 10:17 | 显示全部楼层 |阅读模式
请教,如下SQL,怎样才能提高执行速度?
update gps_0755_20091026 gps set road_state=1
where exists (select 1 from road_0755 road where gps.mesh_grid = road.mesh and
road.mesh='F50F018003'
AND sdo_geom.sdo_distance(gps.geom,road.geom,0.000001)<=3.6)

执行时间:  00: 00: 22.96

更新800行。

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

----------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT               |                   | 92615 |  5788K|  9001   (1)| 00:01:49 |
|   1 |  UPDATE                        | GPS_0755_20091026 |       |       |            |          |
|*  2 |   FILTER                       |                   |       |       |            |          |
|   3 |    TABLE ACCESS FULL           | GPS_0755_20091026 |  2500K|   152M|  6915   (1)| 00:01:23 |
|*  4 |    FILTER                      |                   |       |       |            |          |
|*  5 |     TABLE ACCESS BY INDEX ROWID| ROAD_0755         |   110 |  3190 |    77   (0)| 00:00:01 |
|*  6 |      INDEX RANGE SCAN          | TEST_INDEX        |  2201 |       |     7   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

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

   2 - filter( EXISTS (SELECT 0 FROM "ROAD_0755" "ROAD" WHERE :B1='F50F018003' AND
              "ROAD"."MESH"=:B2 AND "SDO_GEOM"."SDO_DISTANCE"(:B3,"ROAD"."GEOM",0.000001)<=3.6))
   4 - filter(:B1='F50F018003')
   5 - filter("SDO_GEOM"."SDO_DISTANCE"(:B1,"ROAD"."GEOM",0.000001)<=3.6)
   6 - access("ROAD"."MESH"=:B1)
   
   
   SQL> select count(*) from gps_0755_20091026
  2  /

  COUNT(*)
----------
   2500606

SQL> select count(*) from road_0755;

  COUNT(*)
----------
     59415
招聘 : 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
发表于 2010-3-3 10:31 | 显示全部楼层
gps.mesh_grid 有没有索引?

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2010-3-3 10:36 | 显示全部楼层
有索引。

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
发表于 2010-3-3 10:40 | 显示全部楼层
看错了

[ 本帖最后由 battleman 于 2010-3-3 10:58 编辑 ]

使用道具 举报

回复
论坛徽章:
8
2010新春纪念徽章
日期:2010-03-01 11:08:26ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272011新春纪念徽章
日期:2011-02-18 11:43:33奥运会纪念徽章:棒球
日期:2012-07-03 15:20:13奥运会纪念徽章:摔跤
日期:2012-07-22 21:22:28ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48紫蛋头
日期:2013-02-20 09:40:232013年新春福章
日期:2013-02-25 14:51:24
发表于 2010-3-3 10:45 | 显示全部楼层
单纯就这条SQL而言,不考虑对其他的影响

在road_0755表中mesh和geom列上建索引
在gps_0755_20091026表中mesh_grid和geom列上建索引
然后使用index提示指示SQL使用创建的索引

前提是这些列有较高的Cardinality

[ 本帖最后由 myttsd 于 2010-3-3 10:46 编辑 ]

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2010-3-3 10:51 | 显示全部楼层
在geom上和其他列建联合索引可能不行,我没试过,因为这个列是空间信息,和普通的列不一样的。

使用道具 举报

回复
论坛徽章:
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
发表于 2010-3-3 11:29 | 显示全部楼层
挨个条件去掉,再执行SQL,看看哪个条件导致SQL执行缓慢。

使用道具 举报

回复
招聘 : 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
发表于 2010-3-3 11:37 | 显示全部楼层
update gps_0755_20091026 gps
   set road_state = 1
where exists
(select 1
          from road_0755 road
         where gps.mesh_grid = road.mesh
           and road.mesh = 'F50F018003'
           AND sdo_geom.sdo_distance(gps.geom, road.geom, 0.000001) <= 3.6)
and gps.mesh_grid='F50F018003'

执行计划如何
select count(*) from gps_0755_20091026
where mesh_grid='F50F018003'
结果多少
另外sdo_geom.sdo_distance具体算法

使用道具 举报

回复
论坛徽章:
8
2010新春纪念徽章
日期:2010-03-01 11:08:26ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272011新春纪念徽章
日期:2011-02-18 11:43:33奥运会纪念徽章:棒球
日期:2012-07-03 15:20:13奥运会纪念徽章:摔跤
日期:2012-07-22 21:22:28ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48紫蛋头
日期:2013-02-20 09:40:232013年新春福章
日期:2013-02-25 14:51:24
发表于 2010-3-3 11:44 | 显示全部楼层
sdo_geom.sdo_distance是oracle空间数据库内置的,位于mdsys下面

使用道具 举报

回复
招聘 : 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
发表于 2010-3-3 11:56 | 显示全部楼层
晕,学习了
不知道oracle有没有为这种操作提供物化重写之类的优化措施

使用道具 举报

回复

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

本版积分规则 发表回复

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