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

 找回密码
 注册
查看: 6619|回复: 5

[每日一题] PL/SQL Challenge 每日一题:2017-6-17 在并行查询中执行函数

[复制链接]
论坛徽章:
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
发表于 2017-6-23 03:01 | 显示全部楼层 |阅读模式
(原发表于 2011-7-15)

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

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

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

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

作者:_Nikotin

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

我创建了下列的表并且填充了很多数据:

create table plch_parallel
  partition by hash (id)
  partitions 2
  parallel 2
as
  select level id
  from dual
  connect by level <= 1000;

哪些选项在执行之后可能会显示 "2" ?



(A)
create or replace function plch_get_sid return varchar2
is
begin
  return sys_context('USERENV', 'SID');
end;
/
select count(distinct plch_get_sid)
  from plch_parallel
/

(B)
create or replace function plch_get_sid return varchar2 parallel_enable
is
begin
  return sys_context('USERENV', 'SID');
end;
/
select count(distinct plch_get_sid)
  from plch_parallel
/

(C)
create or replace package plch_pkg is
  function get_sid return varchar2;
end;
/

create or replace package body plch_pkg is
  function get_sid return varchar2
  is
  begin
    return sys_context('USERENV', 'SID');
  end;
end;
/

select count(distinct plch_pkg.get_sid)
  from plch_parallel
/

(D)
create or replace package plch_pkg is
  function get_sid return varchar2 parallel_enable;
end;
/

create or replace package body plch_pkg is
  function get_sid return varchar2 parallel_enable
  is
  begin
    return sys_context('USERENV', 'SID');
  end;
end;
/

select count(distinct plch_pkg.get_sid)
  from plch_parallel
/
论坛徽章:
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
 楼主| 发表于 2017-6-24 09:12 | 显示全部楼层
顶一下。

使用道具 举报

回复
论坛徽章:
19
迷宫蛋
日期:2011-11-25 14:00:47秀才
日期:2017-06-29 10:16:48秀才
日期:2017-03-02 10:30:35秀才
日期:2017-03-02 10:30:14托尼托尼·乔巴
日期:2017-01-25 09:38:19暖羊羊
日期:2015-06-15 10:03:48天枰座
日期:2015-07-18 17:23:542015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-04 14:49:39蛋疼蛋
日期:2013-06-21 13:21:23
发表于 2017-6-24 11:27 | 显示全部楼层
B,D.
没有parallel_enable的函数,即使table有paralel属性,无法采用并行,因此A,C不对.

使用道具 举报

回复
论坛徽章:
0
发表于 2017-6-24 17:17 | 显示全部楼层
答案:ABD
C 运行结果为1

使用道具 举报

回复
论坛徽章:
8
技术图书徽章
日期:2014-01-26 13:54:38技术图书徽章
日期:2014-03-27 09:30:56技术图书徽章
日期:2014-03-31 10:50:45技术图书徽章
日期:2014-04-25 14:18:49技术图书徽章
日期:2014-05-19 11:17:53ITPUB14周年纪念章
日期:2015-10-26 17:24:11秀才
日期:2015-06-29 15:26:52秀才
日期:2015-11-11 09:48:44
发表于 2017-6-25 00:01 | 显示全部楼层
顶一下

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2017-6-25 06:03 | 显示全部楼层
答案ABD, 4楼得奖。

A: plch_get_sid函数会被以并行方式执行(取决于资源)因为系统会分析函数体的PL/SQL代码并且决定可以用并行。
B: plch_get_sid函数会被以并行方式执行(取决于资源)因为parallel_enable子句被明确提供,告诉Oracle 这个函数可以并行执行。
C: plch_pkg.get_sid不会被以并行方式执行(取决于资源),因为没有parallel_enable子句,而且Oracle无法分析包里面的函数来隐式确定这个函数是否能够被并行执行。
D: plch_get_sid函数会被以并行方式执行(取决于资源)因为包中的函数包含着parallel_enable子句

使用道具 举报

回复

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

本版积分规则

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