ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 390|回复: 16

可否优化

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2018-1-9 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分页语句
select * from (
       select t.rownum rn,t.* from
                 (select b.column_name,a.owner,a.object_type,a.last_ddl_time
                            from  t_objects a
                          left join t_columns b on a.object_id=b.object_id
                          order by last_ddl_time)
                where rownum<100)
        and rn>80;

  t_objects,t_columns 两表各有记录约 十万条, 走HASH JOIN,大家觉得上面的语句有优化的空间吗?
如果有,能否拿出 证据?谢谢!
认证徽章
论坛徽章:
0
2#
发表于 2018-1-9 21:58 | 只看该作者
1. 把SQL相关表和索引,数据行数和分布,执行计划贴出来。大家可以帮你出出主意;
2. 或者下载一个免费的优化工具,自己搞定。
     下载地址:
      旧帖: /thread-2095752-1-1.html
   

使用道具 举报

回复
论坛徽章:
0
3#
 楼主| 发表于 2018-1-9 22:29 | 只看该作者
create table t_objects as select * from dba_objects;
create table t_columns as select owner,table_name,column_name,data_type,DATA_TYPE_OWNER,COLUMN_ID,NUM_DISTINCT,LOW_VALUE,HIGH_VALUE,DENSITY from dba_tab_columns;

select * from (
       select t.*,rownum as rn from
                 (select b.column_name,a.owner,a.object_type,a.last_ddl_time
                            from  t_objects a
                          left join t_columns b on a.owner=b.owner
                              and a.object_name=b.table_name
                          order by last_ddl_time desc) t
                where rownum<100)
        where rn>80;

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  6ckkb29n58vf2, child number 0
-------------------------------------
select * from (        select t.*,rownum as rn from           (select
b.column_name,a.owner,a.object_type,a.last_ddl_time        from
t_objects a      left join t_columns b on a.owner=b.owner          and
a.object_name=b.table_name      order by last_ddl_time desc) t   where
rownum<100)  where rn>80

Plan hash value: 3439119502

-------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |           |      1 |        |     19 |00:00:00.42 |    1750 |   1744 |       |       |          |
|*  1 |  VIEW                     |           |      1 |     99 |     19 |00:00:00.42 |    1750 |   1744 |       |       |          |
|*  2 |   COUNT STOPKEY           |           |      1 |        |     99 |00:00:00.42 |    1750 |   1744 |       |       |          |
|   3 |    VIEW                   |           |      1 |  63457 |     99 |00:00:00.42 |    1750 |   1744 |       |       |          |
|*  4 |     SORT ORDER BY STOPKEY |           |      1 |  63457 |     99 |00:00:00.42 |    1750 |   1744 | 40960 | 40960 |36864  (0)|
|*  5 |      HASH JOIN RIGHT OUTER|           |      1 |  63457 |    155K|00:00:00.37 |    1750 |   1744 |  6704K|  2359K|   10M (0)|
|   6 |       TABLE ACCESS FULL   | T_COLUMNS |      1 |  78904 |  89204 |00:00:00.17 |     719 |    716 |       |       |          |
|   7 |       TABLE ACCESS FULL   | T_OBJECTS |      1 |  63457 |  72171 |00:00:00.02 |    1031 |   1028 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------

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

   1 - filter("RN">80)
   2 - filter(ROWNUM<100)
   4 - filter(ROWNUM<100)
   5 - access("A"."OBJECT_NAME"="B"."TABLE_NAME" AND "A"."OWNER"="B"."OWNER")

Note
-----
   - dynamic sampling used for this statement (level=2)


35 rows selected.

使用道具 举报

回复
论坛徽章:
304
奥迪
日期:2013-07-29 13:45:59红旗
日期:2014-02-07 10:47:20路虎
日期:2014-02-13 10:34:03保时捷
日期:2014-02-14 09:46:462014年新春福章
日期: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
4#
发表于 2018-1-9 22:52 | 只看该作者
是否存在主外键关系?

对 LAST_DDL_time 建个索引试试,

使用道具 举报

回复
论坛徽章:
182
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:392015年新春福章
日期:2015-04-13 15:11:03马上有对象
日期:2014-10-28 10:28:08马上有钱
日期:2014-10-27 09:26:57马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-11-12 09:33:24马上有钱
日期:2014-11-24 15:17:08马上有对象
日期:2015-01-14 17:33:15沸羊羊
日期:2015-02-11 09:07:41
5#
发表于 2018-1-10 08:37 | 只看该作者
这种优化要规避回表。也就是建立一个大索引来优化。

使用道具 举报

回复
论坛徽章:
69
山治
日期:2017-09-11 19:15:33处女座
日期:2015-11-27 12:27:01秀才
日期:2015-11-23 10:17:19秀才
日期:2015-11-23 09:57:36金牛座
日期:2016-04-01 18:05:22秀才
日期:2015-11-11 10:22:49摩羯座
日期:2015-08-20 16:22:52秀才
日期:2015-08-31 13:02:54秀才
日期:2015-12-25 15:31:10巨蟹座
日期:2015-11-04 12:43:04
6#
发表于 2018-1-10 09:50 | 只看该作者
用SQL做分页永远是浪费计算资源。变化不大直接做宽表算了

使用道具 举报

回复
认证徽章
论坛徽章:
0
7#
发表于 2018-1-10 11:53 | 只看该作者
黄山情缘99 发表于 2018-1-9 22:29
create table t_objects as select * from dba_objects;
create table t_columns as select owner,table_n ...

1. 建索引 create index idx_t_columns_owner_tab_name on t_columns(owner, table_name);

2. 重写一下:
SELECT *
FROM   (SELECT *
        FROM   (SELECT c.*, rownum rn
                FROM   (SELECT owner,object_name,
                               object_type,
                               last_ddl_time
                        FROM   t_objects
                        ORDER  BY last_ddl_time DESC) c
                WHERE  ROWNUM < 100) a
               left join t_columns b
                      ON a.owner = b.owner
                         AND a.object_name = b.table_name)
WHERE  rn > 80

使用道具 举报

回复
论坛徽章:
0
8#
 楼主| 发表于 2018-1-10 22:14 | 只看该作者
正确的方法是建索引ast_ddl_time,owner,object_name,谁能解释一下?

使用道具 举报

回复
论坛徽章:
304
奥迪
日期:2013-07-29 13:45:59红旗
日期:2014-02-07 10:47:20路虎
日期:2014-02-13 10:34:03保时捷
日期:2014-02-14 09:46:462014年新春福章
日期: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
9#
发表于 2018-1-10 23:06 | 只看该作者
黄山情缘99 发表于 2018-1-10 22:14
正确的方法是建索引ast_ddl_time,owner,object_name,谁能解释一下?

贴出出实际的运行结果,若语句加了提示,  gather_plan_statistics 后再执行, 执行结束后获取到的执行过程
那更好,

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
10#
发表于 2018-1-11 16:07 | 只看该作者
本帖最后由 sqysl 于 2018-1-11 16:14 编辑
黄山情缘99 发表于 2018-1-9 22:29
create table t_objects as select * from dba_objects;
create table t_columns as select owner,table_n ...

1、这样的话,两张表不可能数据一样多,t_columns应该比t_objects多不少;
2、create index i1_t_objects in t_objects(last_ddl_time,owner,object_name,object_type),这样,可以做到一箭三雕(再具体自己想,有些版本也许需要hint搞定);如果加上create index i1_t_columns on t_columns(owner,table_name,column_name)也许就更好了。

使用道具 举报

回复

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

本版积分规则

DTCC2018购票6.8折优惠进行时

中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
----------------------------------------
优惠时间:2018年2月13日前

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
北京赛车pk10 申博官网 北京赛车pk10 六台宝典现场开奖 北京赛车pk10历史记录 北京赛车开奖 北京赛车预测 949494开奖结果今晚 威尼斯人线上娱乐 手机投注平台 幸运28投注技巧 pk10助赢软件 北京pk10百度鼎盛彩票网 北京赛车聚彩 北京pk10如何稳杀3码 pk10稳赢方法 pk10定位计划 pk10包赢计划群