查看: 5527|回复: 17

[PL/SQL] 【大话IT】请教大神们讲解下distinct和group by

[复制链接]
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31优秀写手
日期:2014-02-21 06:00:13马上有车
日期:2014-10-09 10:14:53技术图书徽章
日期:2017-07-12 17:18:46妮可·罗宾
日期:2017-08-10 12:13:56
发表于 2015-2-4 22:42 | 显示全部楼层 |阅读模式
--查询出10W数据耗时3分钟,
--走了索引create index test_idx_n1 on test_pk(owner,object_type);
--求更好的改写方式
原SQL
SELECT ROWNUM, M.OBJECT_ID, M.OBJECT_NAME, M.DATA_OBJECT_ID
  FROM (SELECT DISTINCT T.OWNER,
                        T.OBJECT_ID,
                        T.OBJECT_NAME,
                        T.DATA_OBJECT_ID
          FROM TEST_PK T --全表2000W
         WHERE T.OBJECT_TYPE IN ('TABLE', 'INDEX')--过滤后1200W
       ) M
WHERE M.OWNER = 'SCOTT';--过滤后10W左右


--改写后查询10W多数据也是要2分钟
SELECT ROWNUM, M.OBJECT_ID, M.OBJECT_NAME, M.DATA_OBJECT_ID
  FROM (SELECT T.OWNER, T.OBJECT_ID, T.OBJECT_NAME, T.DATA_OBJECT_ID
          FROM TEST_PK T
         WHERE T.OBJECT_TYPE IN ('TABLE', 'INDEX')
           AND T.OWNER = 'SCOTT'
         GROUP BY T.OWNER, T.OBJECT_ID, T.OBJECT_NAME, T.DATA_OBJECT_ID
        ) M

论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-2-4 23:30 | 显示全部楼层
那就只在owner上索引

使用道具 举报

回复
论坛徽章:
17
2013年新春福章
日期:2013-02-25 14:51:242015年新春福章
日期:2015-03-04 14:53:16马上加薪
日期:2014-12-18 01:09:30祖国65周年纪念徽章
日期:2014-09-27 08:49:22马上有房
日期:2014-07-16 11:59:32优秀写手
日期:2014-07-10 06:00:12马上加薪
日期:2014-04-20 23:04:51马上有对象
日期:2014-04-19 23:32:33马上有车
日期:2014-03-29 23:05:24问答徽章
日期:2014-01-17 15:19:03
发表于 2015-2-4 23:54 | 显示全部楼层
rowid 去重 效率会高那么一点点吧

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2015-2-5 03:20 | 显示全部楼层
时间应该花在FETCH了吧。查询本身没什么问题。

使用道具 举报

回复
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31优秀写手
日期:2014-02-21 06:00:13马上有车
日期:2014-10-09 10:14:53技术图书徽章
日期:2017-07-12 17:18:46妮可·罗宾
日期:2017-08-10 12:13:56
 楼主| 发表于 2015-2-5 08:42 来自手机 | 显示全部楼层
本帖最后由 260600sz 于 2015-2-5 08:49 编辑
newkid 发表于 2015-2-5 03:20
时间应该花在FETCH了吧。查询本身没什么问题。

distinct操作1000w然后再加owner,耗时4分钟才查出结果

使用道具 举报

回复
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09优秀写手
日期:2014-05-29 05:59:082015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-09-18 17:02:34
发表于 2015-2-5 09:18 | 显示全部楼层
index(owner,object_type)这个索引只用到了owner和(owner,object_type),object_type都没被当做索引用到。
而且你查询了这两列以外的列,会导致回表查询。

使用道具 举报

回复
论坛徽章:
51
SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:03:45SQL极客
日期:2013-12-09 14:13:35ITPUB社区OCM联盟徽章
日期:2014-12-30 09:12:25SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19双子座
日期:2016-02-26 14:50:25乌索普
日期:2018-03-02 09:19:33
发表于 2015-2-5 09:32 | 显示全部楼层
本帖最后由 workflow263 于 2015-2-5 09:35 编辑

试试  索引create index test_idx_n2 on test_pk2(owner,object_type,OBJECT_ID, OBJECT_NAME, DATA_OBJECT_ID);

SELECT sn, M.OBJECT_ID, M.OBJECT_NAME, M.DATA_OBJECT_ID
   FROM (SELECT row_number() over( partition  by T.OWNER,
                         T.OBJECT_ID,
                         T.OBJECT_NAME,
                         T.DATA_OBJECT_ID order by 1) sn,
                        T.OWNER,
                         T.OBJECT_ID,
                         T.OBJECT_NAME,
                         T.DATA_OBJECT_ID
           FROM TEST_PK T     WHERE T.OBJECT_TYPE IN ('TABLE', 'INDEX') and      t.OWNER = 'SCOTT')  m where sn=1

使用道具 举报

回复
论坛徽章:
3
优秀写手
日期:2014-12-25 06:00:032015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-2-5 09:33 | 显示全部楼层
试试这个会不会快一点
select t.object_id,
       t.object_name,
       t.data_object_id
  from test_pk t
where t.owner = 'SCOTT'
   and t.object_type = 'TABLE'
group by t.object_id,
          t.object_name,
          t.data_object_id
union all   
select t.object_id,
       t.object_name,
       t.data_object_id
  from test_pk t
where t.owner = 'SCOTT'
   and t.object_type = 'INDEX'
group by t.object_id,
          t.object_name,
          t.data_object_id;

使用道具 举报

回复
论坛徽章:
3
优秀写手
日期:2014-12-25 06:00:032015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-2-5 09:33 | 显示全部楼层
试试这个会不会快一点
select t.object_id,
       t.object_name,
       t.data_object_id
  from test_pk t
where t.owner = 'SCOTT'
   and t.object_type = 'TABLE'
group by t.object_id,
          t.object_name,
          t.data_object_id
union all   
select t.object_id,
       t.object_name,
       t.data_object_id
  from test_pk t
where t.owner = 'SCOTT'
   and t.object_type = 'INDEX'
group by t.object_id,
          t.object_name,
          t.data_object_id;

使用道具 举报

回复
论坛徽章:
3
优秀写手
日期:2014-12-25 06:00:032015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-2-5 09:34 | 显示全部楼层
试试这个会不会快一点
select t.object_id,
       t.object_name,
       t.data_object_id
  from test_pk t
where t.owner = 'SCOTT'
   and t.object_type = 'TABLE'
group by t.object_id,
          t.object_name,
          t.data_object_id
union all   
select t.object_id,
       t.object_name,
       t.data_object_id
  from test_pk t
where t.owner = 'SCOTT'
   and t.object_type = 'INDEX'
group by t.object_id,
          t.object_name,
          t.data_object_id;

使用道具 举报

回复

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

本版积分规则 发表回复

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