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

 找回密码
 注册
查看: 2772|回复: 4

[每日一题] PL/SQL Challenge 每日一题:2016-12-9 查询重写(query rewrite)

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2016-12-14 05:19 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者:ChrisSaxon


运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

你正在支持一个考试的应用系统。它在这个模式下保存着答卷的详细信息:

create table plch_quiz_answers (
  user_id         int not null,
  quiz_id         int not null,
  answer_datetime date not null,
  answer_duration int not null,
  primary key ( user_id, quiz_id )
) ;

create materialized view plch_quiz_totals
enable query rewrite
as
  select answer_datetime ,
         count(*),
         sum ( answer_duration )
  from   plch_quiz_answers
  group  by answer_datetime ;

PLCH_quiz_answers 保存有一百万的答卷。PLCH_quiz_totals把它汇总为几千条数据。

哪些选项在你执行查询的时候会在查询重写中用到物化视图?

你可以假设物化视图的数据是新鲜的,并且查询重写所需的其它条件都被满足。

(A)
select answer_datetime,
       sum ( answer_duration )
from   plch_quiz_answers
group  by answer_datetime ;

(B)
select trunc ( answer_datetime ),
       count(*),
       sum ( answer_duration )
from   plch_quiz_answers
group  by trunc ( answer_datetime ) ;

(C)
select count(*)
from   plch_quiz_answers
group  by trunc ( answer_datetime ) ;

(D)
select sum ( answer_duration )
from   plch_quiz_answers ;

(E)
select trunc ( answer_datetime , 'mm'),
       count(*),
       sum ( answer_duration )
from   plch_quiz_answers
group  by trunc ( answer_datetime , 'mm' ) ;

认证徽章
论坛徽章:
1
秀才
日期:2017-01-20 11:00:36
发表于 2016-12-14 23:07 | 显示全部楼层
ABCDE,因为这几个语句都能用到物化视图的结果表去查询。

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
 楼主| 发表于 2016-12-15 05:10 | 显示全部楼层
答案ABCDE, 2楼得奖。

A: 你查询的SQL和物化视图并不需要绝对的匹配。如果你只是选择物化视图的列的一个子集,查询重写仍然可能发生。这个查询正是物化视图的列的一个子集,只是没有COUNT(*),所以Oracle会执行重写。
B: 物化视图是以秒为粒度来保存答卷的。但是这个查询要求的是以天为粒度。所以乍一看似乎查询重写不可能发生。

但是Oracle可以通过日期折叠的方法来使用物化视图。它利用的是日期的层次关系(秒->分->小时->天->月->季度->年)。所以Oracle能够将总计和计数从秒汇总为每日数据。

C: 这同样用了日期折叠来将秒级数据汇总为日级。
D: 你可以通过将按照answer_datetime汇总的数据进行求和得到期间的汇总数据。Oracle可以利用物化视图做同样的事。它可以用查询重写来得到较粗级别的汇总。也即,如果物化视图包含了分组操作group by, 而查询的group by是这些列的子集,Oracle就可以将它用于查询。
E: Oracle同样可以将秒折叠为月,所以它能够将物化视图用于此SQL。

使用道具 举报

回复
论坛徽章:
4
美羊羊
日期:2015-03-04 14:52:282015年新春福章
日期:2015-03-06 11:58:18秀才
日期:2016-11-09 14:46:36秀才
日期:2016-11-25 16:52:36
发表于 2016-12-20 16:58 | 显示全部楼层
得奖是得啥奖,哈 ,哪里看的得了奖,哈 哈

使用道具 举报

回复
论坛徽章:
4
美羊羊
日期:2015-03-04 14:52:282015年新春福章
日期:2015-03-06 11:58:18秀才
日期:2016-11-09 14:46:36秀才
日期:2016-11-25 16:52:36
发表于 2016-12-20 16:59 | 显示全部楼层
哦,不是马上看到,要一段时间才看得到微章是吧,哈

使用道具 举报

回复

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

本版积分规则

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