查看: 1701|回复: 7

[每日一题] PL/SQL Challenge 每日一题:2018-7-6 建表的Storage参数

[复制链接]
论坛徽章:
526
奥运会纪念徽章:垒球
日期: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
发表于 2018-7-11 04:33 | 显示全部楼层 |阅读模式

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

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

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

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

作者: Chris Saxon  

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

下列哪些选项创建了 qz_customers表并且为它分配了一个段(segment),使得下面这个查询:

select bytes from user_segments
where  segment_name = 'QZ_CUSTOMERS';

会返回一行?

(A)
create table qz_customers (
  customer_id   integer not null primary key,
  customer_name varchar2(100) not null
);

(B)
create table qz_customers (
  customer_id   integer not null primary key,
  customer_name varchar2(100) not null
) segment creation immediate;

(C)
create table qz_customers (
  customer_id   integer not null primary key,
  customer_name varchar2(100) not null
);

insert into qz_customers values ( 1, 'First customer!' );

(D)
alter session set deferred_segment_creation = false;

create table qz_customers (
  customer_id   integer not null primary key,
  customer_name varchar2(100) not null
);

(E)
create table qz_customers (
  customer_id   integer not null primary key,
  customer_name varchar2(100) not null
);

alter table qz_customers allocate extent;
论坛徽章:
8
秀才
日期:2018-07-23 13:55:51秀才
日期:2018-07-23 14:00:48技术图书徽章
日期:2018-07-23 14:01:23秀才
日期:2018-07-23 14:01:23秀才
日期:2018-08-31 10:37:01秀才
日期:2018-08-31 10:37:20技术图书徽章
日期:2018-08-31 10:37:44秀才
日期:2018-08-31 10:37:44
发表于 2018-7-11 08:45 | 显示全部楼层
答案:BCDE
A)11gR2开始,空表是不分配segment的,默认是使用segment creation deferred建立,有插入数据的时候才分配。
B)使用了segment creation immediat,会立即分配默认的段
C)初始化了数据,无论是否commit,都会伴随着Oracle对数据表段的创建操作
D)deferred_segment_creation,这个延迟创建段的参数调整为False,其实是和A相反的。
E)对表手工扩展一个extent或多个extent

使用道具 举报

回复
论坛徽章:
8
秀才
日期:2018-07-23 13:55:51秀才
日期:2018-07-23 14:00:48技术图书徽章
日期:2018-07-23 14:01:23秀才
日期:2018-07-23 14:01:23秀才
日期:2018-08-31 10:37:01秀才
日期:2018-08-31 10:37:20技术图书徽章
日期:2018-08-31 10:37:44秀才
日期:2018-08-31 10:37:44
发表于 2018-7-11 08:50 | 显示全部楼层
补充选项B的说明:11gR2的deferred_segment_creation默认true,即创建空表的时候延迟分配,但segment creation immediate优先级高于deferred_segment_creation

使用道具 举报

回复
论坛徽章:
326
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2018-7-11 08:55 | 显示全部楼层
答案 BCDE

A:  延迟段管理 deferred_segment_creation 默认为TRUE ,创建表后,并没有立即创建段对象,除非有数据插入。
B: 创建表时,显示指定子句segment creation immediate,会创建表后,立即创建段对象
C: 创建表后,有数据插入后,也会创建段对象
D: 在会话级显示指定deferred_segment_creation 为FALSE,创建表后,会立即创建段对象
E:  创建表后,显示用alter 命令扩展盘区,会立即创建段对象

使用道具 举报

回复
认证徽章
论坛徽章:
34
林肯
日期:2013-07-30 18:00:55技术图书徽章
日期:2018-05-22 16:13:30秀才
日期:2018-05-22 16:13:30秀才
日期:2018-05-22 16:17:26秀才
日期:2018-07-23 13:38:29技术图书徽章
日期:2018-07-23 13:38:40秀才
日期:2018-07-23 13:38:40秀才
日期:2018-07-23 13:44:01秀才
日期:2018-08-31 10:37:01秀才
日期:2018-08-31 10:37:20
发表于 2018-7-11 09:33 | 显示全部楼层
这种延迟分配,是为了减少系统空间的占用吗?还是有其他的考虑?

使用道具 举报

回复
认证徽章
论坛徽章:
219
2010新春纪念徽章
日期:2010-03-01 11:20:51至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:202015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23管理团队2007贡献徽章
日期:2015-01-19 09:48:27红宝石
日期:2015-01-19 09:46:08海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04海蓝宝石
日期:2017-04-21 09:23:17
发表于 2018-7-11 11:05 | 显示全部楼层
sse_zero 发表于 2018-7-11 09:33
这种延迟分配,是为了减少系统空间的占用吗?还是有其他的考虑?

是为了让“创建表” 这个动作,速度更快。

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期: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
 楼主| 发表于 2018-7-12 08:54 | 显示全部楼层
答案BCDE, 2楼得奖。
A: 从11.2开始,缺省情况下当你创建一个表的时候,DB不会创建一个段。
B: 建表语句现在有了一个段创建子句。这表明了你是否想要数据库立即创建一个段。这会覆盖掉数据库和当前会话的缺省设置。
C: 为了增加一个行你必须分配存储空间!所以这个插入语句会创建一个段。
D: 你可以用deferred_segment_creation参数来修改段创建的缺省行为。当这个参数为false, 数据库在创建表的同时会创建段。

E: 你可以用ALTER TABLE的allocate extent子句来为一个表增加存储空间。

使用道具 举报

回复
认证徽章
论坛徽章:
34
林肯
日期:2013-07-30 18:00:55技术图书徽章
日期:2018-05-22 16:13:30秀才
日期:2018-05-22 16:13:30秀才
日期:2018-05-22 16:17:26秀才
日期:2018-07-23 13:38:29技术图书徽章
日期:2018-07-23 13:38:40秀才
日期:2018-07-23 13:38:40秀才
日期:2018-07-23 13:44:01秀才
日期:2018-08-31 10:37:01秀才
日期:2018-08-31 10:37:20
发表于 2018-7-12 09:38 | 显示全部楼层
wmxcn2000 发表于 2018-7-11 11:05
是为了让“创建表” 这个动作,速度更快。

哦哦。

使用道具 举报

回复

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

本版积分规则 发表回复

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