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

 
 注册
热搜:
查看: 3014|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2017-12-29 表分区(12.2)

[复制链接]
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期: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-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
跳转到指定楼层
1#
发表于 2018-1-4 04:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

原始出处:


作者: Chris Saxon

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

注:本题执行环境为12.2或更高

你在这张表中保存着你的砖块数据:

create table qz_bricks (
  brick_id    integer not null constraint qz_bricks_pk primary key,
  shape       varchar2(30) not null,
  colour      varchar2(30) not null,
  insert_date date not null
) partition by list ( colour ) (
  partition p_red   values ( 'red' ),
  partition p_green values ( 'green' ),
  partition p_blue  values ( 'blue' ),
  partition p_def   values ( default )
);

目前,每个分区中存储的数据按trunc ( insert_date, 'y' )分组是这么多:

SUBOBJECT_ TRUNC(INSER   COUNT(*)
---------- ----------- ----------
P_BLUE     01-JAN-2016        150
P_BLUE     01-JAN-2017        100
P_DEF      01-JAN-2016        150
P_DEF      01-JAN-2017        200
P_GREEN    01-JAN-2016        150
P_GREEN    01-JAN-2017        100
P_RED      01-JAN-2016        150
P_RED      01-JAN-2017        100

缺省分区(P_DEF)包含许多不同的颜色。但是你最近买了100个黄色的砖块。你想要将这些从缺省分区中分离出去。同时,你想要去掉2017以前的砖块,但是仅仅是从缺省分区(P_DEF)和黄色分区中去除。

下列哪些选项:

将p_def分区分裂成 p_yellow 和 p_def
从这两个分区中去除那些插入日期在2017之前的?

例如,在选项执行之后,这个查询的输出:

select uo.subobject_name, trunc( insert_date, 'y' ), count(*)
from   user_objects uo,
       qz_bricks x
where  uo.data_object_id = dbms_rowid.rowid_object(x.rowid)
group  by uo.subobject_name, trunc( insert_date, 'y' )
order  by 1 , 2;

必须是:


SUBOBJECT_ TRUNC(INSER   COUNT(*)
---------- ----------- ----------
P_BLUE     01-JAN-2016        150
P_BLUE     01-JAN-2017        100
P_DEF      01-JAN-2017        100
P_GREEN    01-JAN-2016        150
P_GREEN    01-JAN-2017        100
P_RED      01-JAN-2016        150
P_RED      01-JAN-2017        100
P_YELLOW   01-JAN-2017        100

假设 SQL*Plus 设置如下:

col subobject_name format a10
alter session set nls_date_format = 'DD-MON-YYYY';

(A)
delete qz_bricks partition ( p_def )
where insert_date < date'2017-01-01';

alter table qz_bricks split partition p_def into (
  partition p_yellow values ( 'yellow' ), partition p_def
);

(B)
alter table qz_bricks split partition p_def into (
  partition p_yellow values ( 'yellow' ), partition p_def
) including rows where insert_date >= date'2017-01-01';

(C)
alter table qz_bricks move
  including rows where insert_date >= date'2017-01-01';
  
alter table qz_bricks split partition p_def into (
  partition p_yellow values ( 'yellow' ), partition p_def
);

(D)
alter table qz_bricks split partition p_def into (
  partition p_yellow values ( 'yellow' ), partition p_def
) delete rows where insert_date < date'2017-01-01';

(E)
alter table qz_bricks move partition p_def
  including rows where insert_date >= date'2017-01-01';

alter table qz_bricks split partition p_def into (
  partition p_yellow values ( 'yellow' ), partition p_def
);
论坛徽章:
1
秀才
日期:2018-03-01 09:58:15
2#
发表于 2018-1-4 18:05 | 只看该作者
正确的应该是A B E.
A: 先通过delet语句删除p_def分区表中2017以前的砖块,然后再拆分p_def分区表;
B: 对p_def进行拆分,拆分的结果限定在2017以前的砖块,其余的数据被移除;
C:首先删除数据的已经错了,没有区别分区表。结果就是将所有分区的不符合要求数据清除了;
D:delete语法错误;
E:效果等同于A。

使用道具 举报

回复
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期: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-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
3#
 楼主| 发表于 2018-1-5 04:14 | 只看该作者
答案ABE, 2楼得奖。

A: 它首先从缺省分区删除了插入日期在2017之前的数据行,然后将黄色值分裂为一个单独的分区。
B: (推荐)
"including rows" 子句是12.2的新功能。它允许你在分区维护操作中过滤数据。所以仅仅插入日期从2017起的数据会保留在两个分区中。
C: 你在移动表的时候也可以过滤数据。但是你不能移动一个分区表!仅可以移动里面的分区。所以这个move操作会报错:
"ORA-14511: cannot perform operation on a partitioned object".
D: 过滤分区数据的子句是 "including rows"。Delete rows是无效的。所以这会报错:
"ORA-14126: only a <parallel clause> may follow description(s) of resulting partitions"
E: 你可以在移动分区的同时过滤数据。

使用道具 举报

回复

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

本版积分规则

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