楼主: tan9030

一条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
71#
发表于 2008-3-4 16:39 | 只看该作者
原帖由 tan9030 于 2008-3-4 16:36 发表
今天先到这里,忙一会儿哈

不试一下?等结果呢

使用道具 举报

回复
招聘 : 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
72#
发表于 2008-3-4 16:42 | 只看该作者
原帖由 anlinew 于 2008-3-4 15:32 发表

a 可以驱动d也可以反过来通过test_number被d驱动
a 还可以通过wl_key被b或者c驱动
a 也可以通过site_number被c驱动


从上面的测试来看 a  通过wl_key被b驱动效果是很好的

目前情况是:
RBO下为了照顾'TDB_JOB_TEST'能走上'PK_TDB_JOB_TEST' ,选择了

a 通过TEST_NUMBER 被d驱动


----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (UNIQUE)
   2    1     NESTED LOOPS
   3    2       NESTED LOOPS
   4    3         NESTED LOOPS
   5    4           TABLE ACCESS (BY INDEX ROWID) OF b
      7    4           TABLE ACCESS (BY INDEX ROWID) OF d
     9    3         TABLE ACCESS (BY INDEX ROWID) OF a
    11    2       TABLE ACCESS (BY INDEX ROWID) OF c

这还算清楚了吧

这里面想办法把a跟d换个位子就差不多了

[ 本帖最后由 anlinew 于 2008-3-4 16:43 编辑 ]

使用道具 举报

回复
招聘 : 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
73#
发表于 2008-3-4 16:46 | 只看该作者
以上是基于RBO的说法,CBO没这么土。。。。。

使用道具 举报

回复
招聘 : 网络运维
论坛徽章:
2
会员2006贡献徽章
日期:2006-04-17 13:46:34数据库板块每日发贴之星
日期:2008-03-05 01:04:27
74#
 楼主| 发表于 2008-3-4 17:07 | 只看该作者
原帖由 anlinew 于 2008-3-4 16:30 发表

按照这个走下去估计最终也就毫秒级
RBO真是土啊


这样试试:

TDB_JOB_TEST d,                    大小576m,  (JOB_KEY, TEST_NUMBER)
改成test_number,job_key试试


原来的index (JOB_KEY, TEST_NUMBER) ,不能被drop,于是我重新建立了一个(TEST_NUMBER,JOB_KEY)
CREATE UNIQUE INDEX PK_TDB_JOB_TEST_1 ON TDB_JOB_TEST
(TEST_NUMBER,JOB_KEY);

然后运行最初的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
75#
发表于 2008-3-5 09:43 | 只看该作者
原帖由 tan9030 于 2008-3-4 17:07 发表


原来的index (JOB_KEY, TEST_NUMBER) ,不能被drop,于是我重新建立了一个(TEST_NUMBER,JOB_KEY)
CREATE UNIQUE INDEX PK_TDB_JOB_TEST_1 ON TDB_JOB_TEST
(TEST_NUMBER,JOB_KEY);

然后运行最初的sql,好像还是很慢...

新建不好使的 ,换顺序重建就是使job_key的索引在这里不被使用,别的方法做到这个也成,呵呵
因为是pk引用的索引,所以不能drop?

[ 本帖最后由 anlinew 于 2008-3-5 09:45 编辑 ]

使用道具 举报

回复
招聘 : 网络运维
论坛徽章:
2
会员2006贡献徽章
日期:2006-04-17 13:46:34数据库板块每日发贴之星
日期:2008-03-05 01:04:27
76#
 楼主| 发表于 2008-3-5 14:45 | 只看该作者
原帖由 anlinew 于 2008-3-5 09:43 发表

新建不好使的 ,换顺序重建就是使job_key的索引在这里不被使用,别的方法做到这个也成,呵呵
因为是pk引用的索引,所以不能drop?


各位帮忙的,看客,多谢大家的支持,我今天上午到现在用了6个小时的时间对表索引进行了分析,脚本如下:
sql> alter session set sort_area_size=20971520;
sql> set serveroutput on size 1000000
sql>  execute dbms_starts.gather_schema_stats (ownname='EDAUSER',cascade=>TRUE,estimate_percent=>dbms_stats.auto_sample_size);

执行完成后,我在使用最初没有hint的sql, 2分多种就可以得到正确的结果。

使用道具 举报

回复
论坛徽章:
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
77#
发表于 2008-3-5 15:20 | 只看该作者
现在的SQL_PLAN是怎么样的

使用道具 举报

回复
招聘 : 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
78#
发表于 2008-3-5 16:22 | 只看该作者
原帖由 tan9030 于 2008-3-5 14:45 发表


各位帮忙的,看客,多谢大家的支持,我今天上午到现在用了6个小时的时间对表索引进行了分析,脚本如下:
sql> alter session set sort_area_size=20971520;
sql> set serveroutput on size 1000000
sql>  execute dbms_starts.gather_schema_stats (ownname='EDAUSER',cascade=>TRUE,estimate_percent=>dbms_stats.auto_sample_size);

执行完成后,我在使用最初没有hint的sql, 2分多种就可以得到正确的结果。

有成就感不?
继续,

使用道具 举报

回复
论坛徽章:
0
79#
发表于 2008-3-5 16:24 | 只看该作者
2分钟的查询,其效率还是无法让人满意的。

使用道具 举报

回复
招聘 : 网络运维
论坛徽章:
2
会员2006贡献徽章
日期:2006-04-17 13:46:34数据库板块每日发贴之星
日期:2008-03-05 01:04:27
80#
 楼主| 发表于 2008-3-5 16:48 | 只看该作者
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=956 Card=1 Bytes=58)
   1    0   SORT (AGGREGATE)
   2    1     NESTED LOOPS (Cost=956 Card=1 Bytes=58)
   3    2       NESTED LOOPS (Cost=880 Card=38 Bytes=1672)
   4    3         NESTED LOOPS (Cost=787 Card=31 Bytes=899)
   5    4           TABLE ACCESS (BY INDEX ROWID) OF 'TDB_REGISTER_WL'
           (Cost=379 Card=408 Bytes=7752)

   6    5             INDEX (RANGE SCAN) OF 'IDX_TDB_REG_WL_START_T' (
          NON-UNIQUE) (Cost=4 Card=408)

   7    4           INDEX (UNIQUE SCAN) OF 'PK_TDB_JOB_TEST' (UNIQUE)
          (Cost=1 Card=1 Bytes=10)

   8    3         INDEX (RANGE SCAN) OF 'PK_TDB_TEST_RESULTS_WL' (UNIQ
          UE) (Cost=3 Card=1 Bytes=15)

   9    2       TABLE ACCESS (BY INDEX ROWID) OF 'TDB_PART_RESULTS_WL'
           (Cost=2 Card=1 Bytes=14)

  10    9         INDEX (UNIQUE SCAN) OF 'PK_TDB_PART_RESULTS_WL' (UNI
          QUE) (Cost=1 Card=1)





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

SQL> SQL> SQL> SQL>

使用道具 举报

回复

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

本版积分规则 发表回复

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