快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱h188下载app手机版_集报网



由Oralce8.1开始,Oracle增添了一个新的特点便是Stored Outlines,或者称为Plan Stability(计划稳定性)。这个特点带来三个好处。首先,你可以优化开销很大年夜的语句的处置惩罚。第二,假如有一些语句Oracle必要花费长光阴来优化(而不是履行),你可以节省光阴并且削减优化阶段的竞争。着末,它可以让你选择应用新的cursor_sharing参数而无必要担心是以而不采纳优化的履行路径。

要知道若何应用存储概要才是最优的,我们首先运行一些极端没有效率的SQL的存储历程开始,要留意的是,我们不能改动源代码(理论上)。

我们将看一下若何跟踪SQL语句,并且查看它当前在数据库中的履行计划,找出一些提示来改进SQL语句的机能,然后再从新履行该SQL语句时,让Oracle应用我们的提示。

在这个示例中,我们将创建一个用户,在该用户的模式中建一个表格,并且创建一个存储历程造访该表格,我们将在这个存储历程上应用wrap对象,这样我们就不能经由过程反向要领获得源代码。然后我们将经由过程该存储历程来调试SQL的履行。

例子中我们将假定存储慨要已经在数据库创建的时刻被自动安装。

筹备事情

创建一个用户,他的权限有:create session, create table, create procedure, create any outline, and alter session。以该用户连接并且运行以下的脚原先创建一个表格:

create table so_demo (

n1 number,

n2 number,

v1 varchar2(10)

)

;

insert into so_demo values (1,1,'One');

create index sd_i1 on so_demo(n1);

create index sd_i2 on so_demo(n2);

analyze table so_demo compute statistics;

接着必要编码来创建一个存储历程造访该表格。创建一个称为c_proc.sql的脚本,如下:

create or replace procedure get_value (

i_n1 in number,

i_n2 in number,

io_v1 out varchar2

)

as

begin

select v1

into io_v1

from so_demo

where n1 = i_n1

and n2 = i_n2

;

end;

/

当然,也可以直接履行这个脚原先建立该历程--不过,为了更有效果,转到操作系统的敕令行并且履行以下敕令:

wrap iname=c_proc.sql

相应是:

Processing c_proc.sql to c_proc.plb

这里不是经由过程履行c_proc.sql脚原先孕育发生该历程,而是履行看不到源码的c_proc.plb脚本,你将会发明在user_source和记娱h188下载app手机版的视图中找不到我们的SQL语句。

这个利用的感化是什么?

现在我们已经孕育发生了一个模拟的利用,我们就可以运行它,打开sql_trace,看看有什么工作发生。我们将会发明这个SQL履行一个全表搜索来获得哀求的数据。

在这个测试中,全表检索或许是最有效的要领--不过让我们假定已经证实应用一个单列的索引和and-equal选项才是最佳的履行路径时,我们可以如何改动呢(无需在代码中加入提示)?

经由过程存储概要,谜底是简单的。要达到我下面所做的工作实际上有好几种措施,是以不要觉得这是独一的做法。Oracle不停改进它的特点以方便应用,这里所讲的技巧或许在未来的一个版本中就会消掉。

你想该利用做什么?

要令Oracle如我们所想的那样运作,有三个阶段:

. 启动一个新的session(连接),然后从新运行该历程,首先奉告Oracle我们要跟踪将要运行的SQL语句和该SQL应用的路径。这里说的"路径"便是我们存储概要的第一个例子。

. 为有问题的SQL语句创建更好的存储概要,然后用好的代替有问题的。

我们可以看到在demo的分类中只有一个存储概要,查看概要中的sql_text我们可以看到与我们原本PL/SQL代码类似的、但又有点不合的语句。这是很紧张的一点,由于Oracle仅在存储的sql_text和将要履行的SQL异常相似的时刻才会应用存储概要。实际上,在Oracle8i中,两个SQL语句要完全一样才可以,这也是存储概要的一个大年夜问题。

你可以由列表中看到存储概要中是一套hints用来描述Oracle若何履行(或者将要履行)该SQL。这个计划应用一个全表搜索--纵然是一个全表搜索这样的操作,Oracle应用大年夜量的hints来确保履行的计划。

要留意到存储概要平日都是属于一个分类的;在这里是demo分类,我们是经由过程alter session敕令来指定的。假如在上面的敕令中,我们应用true来代替demo,我们将在一个名字为default的分类中找到该存储概要。

存储概要都有一个名字,该名字在全部数据库中都必须是独一的。没有两个概要的名字是相同的,纵然是它们是由不合的用户孕育发生。实际上,概要并不是由谁拥有的,它们仅有创建者。假如你创建的一个存储概要和我今后履行的一个SQL语句匹配,Oracle将会利用你的hints列表到我的语句--纵然这些hints在我的模式中是无意义的。(这样我们就有完全不合的选项来诈骗存储概要,不过这是另一篇文章的工作了)。你还可能留意到,当Oracle自动孕育发生计储概要时,它和记娱h188下载app手机版的名字中包孕有一个靠近毫秒的光阴戳。

继承处置惩罚我们那个有问题的SQL,我们鉴定假如应用一个/*+ and_equal(so_demo, sd_i1, sd_i2) */ 的hint,那么Oracle将会应用我们想要的履行路径,以是我们现在经由过程以下的措施显式创建一个存储概要:

create or replace outline so_fix

for category demo on

select /*+ and_equal(so_demo, sd_i1, sd_i2) */ v1

from so_demo

where n1 = 1

and n2 = 2;

update outln.ol$hints

set ol_和记娱h188下载app手机版name =

decode(

ol_name,

'SO_FIX','SYS_OUTLINE_020503165427311',

'SYS_OUTLINE_020503165427311','SO_FIX'

)

where ol_name in ('SYS_OUTLINE_020503165427311','SO_FIX')

;

对付这样做,你可能认为有点不习气,分外是根据指南上的建议--不过这个更新在Metalink(译者注:这是Oracle的一个技巧支持站点)上是容许的。不过,你还必要做第二次更新来确保和每个存储概要相联系的hints数目维持同等。假如你轻忽了这一步,你将会发明你的一些存储概要被毁坏,或者在一个导出/导入中的处置惩罚中被破坏。

update outln.ol$ ol1

set hintcount = (

select hintcount

from ol$ ol2

where ol2.ol_name in ('SYS_OUTLINE_020503165427311',' SO_FIX')

and ol2.ol_name != ol1.ol_name

)

where

ol1.ol_name in ('SYS_OUTLINE_020503165427311','SO_FIX')

;

一旦完成上面的语句,你就可以提议一个新的连接,奉告它应用存储概要,从新运行该历程然退却撤退出;同样地,你可以应用sql_trace来确认Oracle确凿是这样做的。要奉告Oracle应用改动后的存储概要,你可以应用以下的敕令:

a和记娱h188下载app手机版lter session set use_stored_outline = demo;

反省trace文件,你将会发明该SQL现在应用and_equal的路径(假如你应用tkprof来处置惩罚和解释trace文件,你将会发明输出显示了两个抵触的路径。第一个将展示应用的and_equal路径,第二个将可能是一个全表搜索,这是由于在tkprof在跟踪的SQL上履行explain plan时,该存储概要可能没有被调用)。

Oracle9的另一个特色是在治理存储概要时有更多的支持,包括初次推出了一个包来让你直接编辑存储概要。更紧张的是,还有一个选项可让你更安然地治理临盆系统上的计划。虽然没人爱好在临盆情况上做实验,不过在有些时刻,只有临盆系统才有精确的数据散播和卷,以让你抉择某个SQL的最优履行路径。在Oracle9中,你可以创建一个outln表的私人拷贝,并且将"public"的概要开释进去以作"私人的"实验,这样你就不用冒你的私人存储概要被终端用户的代码看到的危险。我小我觉得这是一个着末的手段,不过我可以想象到无意偶尔它是必须的。更安然的是,假如你有一个full-scale UAT或者开拓系统,可以应用这个特点自由地测试。

告诫

这篇文章给你足够的信息作存储概要的实验;不过在利用该技巧到一个临盆系统上时,还有一些地方是你必须意识到的。

首先--在Oracle8i中,outln(这是拥有存储概要的那些表格所在的模式)有一个默认的密码,该帐号有一个异常危险的权限。你必须改动这个帐号的密码。在Oracle9i中,你将会发明这个帐号已经被锁定。

第二--维持存储概要的表格在system表空和记娱h188下载app手机版间中创建。在一个临盆系统中,当你开初创建存储概要时,你将会发明会应用system表空间中的很多空间。是以最好将这些表格移走,最好是放到它们自己的表空间中。不幸的是,此中的一个表格含有long列,是以你将可能必要应用exp/imp将这些表格移动到一个新的表空间中。

第三--虽然存储概要对付办理严重的机能问题是很有用的,不过它也有一个开销。假如激活了存储概要,那么Oracle在阐发每个新的语句时都邑反省是否存在一个相关的存储概要。假如大年夜量的语句都没有存储概要,那么你就必要平衡一下这个开销与你在很少拥有存储概要语句上获得的机能提升,看是否值得这样处置惩罚。不过,这个问题只会在一个有着更严重机能问题的系统上呈现。

结论

存储概要有着伟大年夜的好处。当你不能改动源代码或者索引策略时,存储概如果令第三方的利用运行得更有效率的独一措施。

更进一步,假如你还必要面对将一个系统由基于规则切换到开销优先的问题,那么存储概要将是你最有效率和无风险的选择。

假如你必要发挥存储概要的最大年夜好处,那么Oracle9有一些加强可让它覆盖更多类的SQL,削减开销,并可让你更机动地测试、治理和安装存储概要。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: