电脑安全

您当前的位置:主页 > 电脑安全 >

用共享游标提升 MSSQL 性能-网络编程

来源:[db:来源]标题:   语句    编辑:电脑技术全能网 时间:2019-09-18 12:30

原标题:用共享游标提升 MSSQL 性能-网络编程
   中心提醒:本文论述在Oracle8i Release 2和Oracle9i中加强的游标同享设备  Boost SQL Performance with cursor_sharing    要害词:cursor_sharing    概述  本文论述在Oracle8i Release 2和Oracle9i中加强的游标同享设备。这些加强功效被一个新的参数cursor_sharing操纵。  cursor_sharing的目标就是进步没有应用绑定变量(bind vvariable)的利用顺序效劳器的机能。    须要 cursor_sharing  本段说明为甚么利用顺序不应用绑定变量(bind variables)会带来机能成绩。    利用顺序重复履行类似的SQL语句  应用Oracle数据库治理他(她)们的数据的利用顺序必需应用SQL语句拜访/修正数据库。这些SQL语句能够是由一个利用顺序应用OCI, OCCI, JDBC, PL/SQL等间接发生的,也是能够是应用其余东西和库(比方:dbms_sql)直接发生的。  依据不必的利用范例,平日一个利用顺序都为终极用户供给了一个牢固的功效聚集,比方,一团体力资本利用顺序能够会供给一些像增添一个新雇员,修正一个雇员的团体信息等功效。终极这些功效应用SQL拜访和/或修正数据。由于利用顺序反复地履行这些功效,一个利用和Oracle数据库的交互是由类似的SQL语句的重复履行形成的。    SQL挪用的步调  为履行一个SQL语句,客户端能够应用应用差别的接口。比方,经过OCI接口,客户端创立一个语句句柄(statement handle),而后perpare这个语句,绑定,界说和履行这个语句句柄,或许,SQL语句也能够经过一个PL/SQL进程被履行。  依照客户端接口,Oracle数据库始终都应用牢固的步调(默许):  1. 翻开一个游标 - 用户游标是一个和SQL语句相干的全体用户状况的句柄,像履行内存,同享游标援用,用户游标确当前状况等等。  2. 剖析一个SQL语句到翻开的用户游标中 -使SQL语句和用户游标关系;它也树立了一个同享游标,对应于SQL语句的剖析格局。在一些情形下,同享游标也能够作为剖析的一局部被校订和优化。剖析,校订和优化SQL语句的进程平日长短常消耗CPU时光,内存和衔接资本的。  3. 若有须要,绑定变量 - 给Oracle供给SQL语句中绑定变量的数据范例,巨细和值等须要的信息。  4. 校订优化同享游标,假如还没有做这项任务的话。  5. 履行用户游标 - 这一步真正实现语句履行的任务,依据语句的庞杂水平耗费CPU和会话内存(session memory)。  留神,剖析,校订和优化(在本文中统称为编译)构成了履行一个SQL语句的耗费,而且可能限度数据库的容量和可丈量性。    同享游标  一个典范的反复履行类似语句的利用,在Oracle数据库很多针对SQL处置目标的优化反复履行。最主要的优化是同享游标,试图经过在雷同的语句的差别履行之间同享编译成果来打消编译的消耗(不是并发就是在差别的时光产生)。以下图:  User Session 1     Private  execution  state   User Session 2     Private  execution  state   Shared Cursor    为了可能应用同享游标,Oracle宰割语句履行状况到同享游标中,而且在实例中预处置。同享游标是编译的成果并包括了履行打算;它在缓存在同享池中。每个履行该语句的会话有一个预履行状况的公有拷贝,如用户游标,运转时变量值等。  在剖析阶段(下面提到的第2步),Oracle起首搜寻一个曾经存在的能够被用户会话同享的同享游标。Oracle把搜寻分为两步:基于SQL文本的检索,找到雷同SQL文本创立的游标,依据其余尺度抉择恰当的游标,如优化形式,拜访的基础工具等。假如一个能够同享的游标被找到,并不须要编译,这个处置成为软剖析(soft parse)。不然,编译SQL语句创立新的同享游标,这个处置成为硬剖析(hard parse)。  当被利用顺序应用的大少数语句可能同享一样的游标聚集时,大少数剖析酿成为软剖析,进而进步数据库效劳器的才能/吞吐量(缩减了内存和CPU的应用),呼应时光(增加懂得析阶段所应用的时光)和可丈量性(增加了闭锁衔接(latch connection) )。    为甚么游标不是同享的?  假定其余的要素是雷同的,如可设置的实例/会话/事件品级参数,实践上,假如在一样的行/工具上履行一样的操纵,应用一样的打算,语句S1和S2的游标能够被同享。然而要盘算和找出这些游标长短常艰苦的,如许做也能够对消同享游标带来的利益。因而,Oracle游标同享尺度划定在全部的情形下默许都不同享游标,除非它们被计划得很高效。从8i Release 2开端,假如S1和S2都是文本的而且很多的其余前提都雷同(工具名被转换成为一样的基础工具,会话中语句的优化形式雷同,等等),它们能够同享统一个游标。  当利用顺序在语句中应用笔墨标量替换绑定变量时就会招致一个游标同享的成绩。如利用顺序终极发生的语句只是在笔墨标量上有一些差别,乃至语句都是雷同的。如,一个利用顺序没有应用绑定变量,能够假定在差别的时光或差别的会话中有上面两个语句:  INSERT INTO T VALUES(1, ‘foo’, 4)  INSERT INTO T VALUES(2, ‘bar’, 7)  由于这两个语句文本上并不雷同,它们终极发生差别的游标。  有几种情形下利用顺序能够不会应用绑定变量:  l 用笔墨标量很轻易就写出一个SQL语句,特殊是应用了一些东西  l 老的Oracle关联数据库不支撑绑定变量(最少是没有同享游标的利益,从Oracle7才开端应用它们),已有的利用顺序请求作一些代码进级的任务。  l 其余全部的数据库供给商都不支撑绑定变量,即便有语法也不雷同;因而,应用特定的Oracle语法/特征会使利用顺序得到与其余数据的兼容性。  l 假如一个语句应用绑定变量,那末它就始终应用雷同的履行打算。假如差别的绑定变量会有差别的优化打算便可能发生成绩,如,斟酌上面的语句:  SELECT * FROM T1, T2 WHERE (T1.N <= 100) AND (T1.N1=T2.N2)  SELECT * FROM T1, T2 WHERE (T1.N <= 500) AND (T1.N1=T2.N2)  依据值在字段N中的散布,两个语句能够有差别的优化打算。因而应用绑定变量:  SELECT * FROM T1, T2 WHERE (T1.N <= :X) AND (T1.N1=T2.N2)  将会因为一些绑定变量的值招致低效的优化。这时能够强迫应用笔墨标量取代绑定变量。    观点  在开端处理计划之前,这里先廓清一些基础观点。  类似语句(Similar statements)  假如任何两个语句只是笔墨标量不雷同,能够以为它们是类似的。  这纯洁是一个语义学上的尺度。  比方:以下的语句是类似的  INSERT INTO T VALUES(1, ‘foo’, 4)  INSERT INTO T VALUES(2, ‘bar’, 7)  INSERT INTO T VALUES(5, ‘alpha’, 11)  INSERT INTO T VALUES(10, ‘kappa’, 17)  最优同享语句(Optimally sharable statements)  类似语句能够有也能够没有一样的履行打算。比方,上面两个语句就有雷同的履行打算:  INSERT INTO T VALUES(1, ‘foo’, 4)  INSERT INTO T VALUES(2, ‘bar’, 7)  在本文中,这些语句叫做最优同享语句。  因而:  最优同享语句是存在雷同最优打算的类似语句。  一样也象征着最优同享语句能够同享雷同的游标,而不会对履行本钱有任何的影响。  非最优化同享语句(Sub-optimally sharable statements)  另一面,以下面两个语句:  SELECT * FROM T1, T2 WHERE (T1.N <= 100) AND (T1.N1 = T2.N2)  SELECT * FROM T1, T2 WHERE (T1.N <= 500) AND (T1.N1 = T2.N2)  依据(N<=100)和(N<=500)的行数,值在字段N中的散布,在N, N1或N2上索引的可用性等情形,能够有差别的最优打算。比方,第一个语句能够应用一个在T1上的索引,而第二个语句能够是在T1上做全表扫描。或许第一个语句能够是作一个哈希衔接而第二个语句能够是做一个嵌套轮回衔接。这些语句呼应地能够看成长短最优化同享语句,因而:  非最优化同享语句是能够存在差别最优打算的类似语句。  一样也象征着假如非最优化同享语句同享一样的游标,那末在履行效力上能够会存在丧失。  最优同享与非最优同享语句  最优同享和非最优同享语句的差别并不纯洁是在语义上的。它依靠于上面的要素:  l 笔墨标量在语句中的地位(比方,是在VALUES子句中仍是在WHERE子句中)  l 可用的拜访门路(比方,索引的存在)  l 假如一个笔墨标量呈现在一个包括字段的谓词中(如,N<=100用到了在字段N上的统计值的可用性),则取决于数据散布(统计值)和它的可用性  l 优化器的算法应用  非同享语句  由于应用一样的游标会发生不准确的成果,会呈现类似语句不能同享统一个游标的情形。这些类似语句象征着差别的事件,或许在履行时期做了完整差别的事。上面的语句描写了这一点:  SELECT * FROM T ORDER BY 1,4  SELECT * FROM T ORDER BY 2,3  在这个例子中,笔墨标量1,2,3和4指的是抉择表项中的名目。这些语句叫做非同享语句。因而有:  非同享语句是不能同享一样的履行打算的类似语句。  这里最主要的一点就是:假如两个非同享语句同享一样的游标,它们此中一个就会失掉过错的成果。    处理计划  这一节描写经过cursor_sharing参数所供给的处理计划  概述  新参数cursor_sharing只有有能够就同意类似语句同享游标。依据参数的值,类似语句能够被强迫同享雷同的游标(有能够会应用非最优打算),或许同享雷同游标而不危及底层履行打算的保险。  不论设置cursor_sharing为SIMILAR仍是FORCE,Oracle都起首搜寻完整雷同的语句文本的游标。假如没有发觉,Oracle搜寻类似语句文本的游标。  用法  参数:cursor_sharing  从Oracle 8i Release 2开端,一个新的静态参数cursor_sharing被引入。在8i中,参数能够有两个差别的值FORCE和EXACT。从9i开端,一个新的值SIMILAR被参加。  默许值是EXACT。它只同意完整雷同文本的语句同享一个游标。这是晚期版本的行动。  SIMILAR参数值使类似语句同享一样的游标,而不危急履行打算的保险。比方:只要最优同享语句同享游标。  将参数值设为FORCE会逼迫Oracle对类似语句同享游标,但存在非最优履行打算的危险,如,最优同享和非最优同享语句会同享统一个游标。只要在非最优履行打算的危险被同享游标的机能进步超越的时间,该参数才能够被设置为FORCE,比方:假如太多的非最优同享语句的硬剖析招致了严峻的机能成绩。  SQL语句  一个新的标志CURSOR_SHARING_EXACT在被SQL语句中被用于在语句级别操纵游标同享。这个标志相似于初始化参数cursor_sharing被设置为EXACT,并屏障了曾经设定的初始化参数的值,也就是:它招致语句同享采纳准确婚配构建的游标。  ALTER SYSTEM 和 ALTER SESSION 下令同意新参数cursor_sharing的设置和转变。语法以下面的情势:  ALTER SYSTEM SET cursor_sharing = {FORCE | SIMILAR | EXACT}  ALTER SYSTEM SET cursor_sharing = {FORCE | SIMILAR | EXACT}  静态视图  上面的四个静态视图表现了绑定变量的信息:  l GV$SQL_BIND_METADATA  l V$SQL_BIND_METADATA  l GV$SQL_BIND_DATA  l V$SQL_BIND_DATA  这些视图也包含了外部绑定变量的信息。外部绑定变量能够依据视图[G]V$SQL_BIND_DATA中的字段SHARED_FLAG2与用户绑定变量辨别,外部绑定变量的标志值为256。  只参看外部绑定变量的行,用户能够斟酌上面的语句:  SELECT * FROM V$SQL_BIND_DATA WHERE BITAND (SHARED_FLAG2, 256) =256  重要好处与调和  斟酌一个没有应用绑定变量的利用,该利用反复地应用类似语句,大少数的履行都将招致硬剖析。  一个不应用绑定变量的典范利用能够会有种种范例的语句:最优同享,非最优同享安和非同享。关于最优同享语句,同享游表明显是有利益;非同享语句不能同享一样的游标。  关于非最优同享语句没有一个简略的谜底:同享游标与猎取最优打算的比拟是硬剖析的体系消耗与强迫应用雷同履行打算后的机能进化之间的调和。因而,依据体系负载,利用特点,资本限度等,准确的谜底是差别的。这也是Oracle 供给为cursor_sharing供给两个差别的值SIMILAR和FORCE,并把决议权留给用户的起因。SIMILAR是更守旧的抉择,它仅仅使最优可同享语句同享游标。采纳FORCE,最优同享和非最优同享语句都被强迫同享游标,成果便弗成猜测,由于游标能够被同享但履行打算的机能也下降了。因而,由于硬剖析形成机能有十分大的影响而且非最优同享语句占十分大的百分比的情形下,应用FORCE是故意义的。别的一个斟酌的方法是:在采纳FORCE 之前先实验SIMILAR。  当cursor_sharing采纳类似语句同享游标的时间,硬剖析转换为软剖析。留神,因为推断语句类似性的附加本钱,软剖析比已应用绑定变量的利用的软剖析(用绑定变量在外部调换笔墨标量)破费要高贵一些。然而,完整保留在CPU外部,内存和锁合作任然须要斟酌。  关于cursor_sharing,Oracle任然起首搜寻一个准确婚配。只要当一个完整雷同文本语句的游标没有找到时,Oracle搜寻一个类似语句的游标。如许做是为了确保当碰到雷同的没有硬编码笔墨标量的SQL文本的时间,不会对机能有所影响。  由于在查找游标之前置换笔墨标量,其余的Oracle优化,像session_cached_cursors和cursor_space_for_time 能够便利地和cursor_sharing整合。比方,将cursor_sharing和session_cached_cursors设置为一个公道的值,在笔墨标量被外部绑定变量置换以后,类似语句便可以应用缓冲翻开游标。  重要利益的提要以下:  l 利用顺序不须要做转变  l 对曾经应用绑定变量的语句没有副感化  l 应用SIMILAR,常常同享的游标不会影响履行打算  l 作为最初的方法,全部的类似语句都能够用FORCE强迫同享游标  警告  混杂语句(Mixed statements)  混杂语句是既有绑定变量也有硬编码笔墨标量的语句。如:  INSERT INTO T VALUES(5, ‘alpha’, :X)  假如是应用Oracle7 OCI的客户端,混杂的类似语句不会经过cursor_sharing同享游标;在更新的版本中能够同享游标(从Oracle8 OCI开端)。现实上,这也一样实用于在效劳器上的PL/SQL存储进程的SQL语句,由于在效劳器上的PL/SQL应用了较老的客户端接口。  经过PL/SQL的动态SQL  Cursor_sharing关于在PL/SQL中的动态(嵌入)SQL没有任何影响。  存储提要(Stored outlines)  任何存储提要树立都没有将cursor_sharing设置为FORCE或SIMILAR,当cursor_sharing被设置时(FORCE或 SIMILAR)速率并不会有晋升。那是由于存储提要被SQL文本索引,以后的cursor_sharing完成修正语句文本。为了应用带有游标同享的存储提要,它们必需应用create_stored_outlines参数重修(而且不要应用创立提要语句)。    消耗(Overhead)  应用FORCE或SIMILAR参数,搜寻为类似语句创立的游标存在一个消耗。像后面说起的,这包含:  l 用原始语句文本搜寻游标  l 用外部绑定变量调换笔墨标量,而且基于新文本的搜寻  当同享游标任务的时间,这个消耗并不主要,由于大批的硬剖析会被破费很小的软剖析调换。然而,当游标同享没有显明的增添的时间,这些消耗会对机能发生负面的影响。在三种情形下它会产生时:  1. 利用顺序没有应用绑定变量,公布雷同的语句,而且没有类似语句  假如利用顺序始终用一样的笔墨标量硬编码履行一样的语句,它会产生。如许的利用顺序默许应用软剖析,而且设置游标同享为FORCE或SIMILAR,会使软剖析更高贵。    针对如许一个利用的情形,有一个诀窍能够应用:在同享池暖启动当前,也就是,在全部有雷同笔墨标量的语句都被编译了当前,cursor_sharing能够被设置为FORCE或SIMILAR。这类情形下,Oralce会连忙发觉哪些语句的游标,幸免额定的耗费。    假如在一个利用中,有一些语句应用一样的笔墨标量而有一些语句转变笔墨标量,这十分的有效。    2. 利用顺序公布差别构造的语句,因此没有任何类似语句  如许的利用默许应用硬剖析,设置cursor_sharing为FORCE或SIMILAR会使硬剖析更高贵一些。    3. 没有应用绑定变量的利用,设置cursor_sharing为SIMILAR,大局部类似语句被次最优化同享  如许的利用默许采纳硬剖析,将cursor_sharing设为FORCE,大批应用软剖析。设置cursor_sharing为SIMILAR,将使硬剖析更高贵一些。    应用FORCE  应用FORCE能够会招致一个十分坏的履行打算被应用。在有些情形下,坏的履行打算和洽的履行打算之间的差别长短常主要的,如,DSS情况。因而,Oralce不推举在这类情形下应用FORCE。  何时应用游标同享?  这一段作一些对于应用游标同享的倡议。  应用cursor_sharing=SIMILAR  像新近说起的,cursor_sharing并不会侵害应用绑定变量编写的利用顺序的机能。设置cursor_sharing为SIMILAR,在大少数情形下,进步没应用绑定变量的利用顺序的机能(在前一段说起的两个情形破例)。因而,如果没有应用绑定变量的利用顺序的机能成绩,将 cursor_sharing设置为SIMILAR危险最小。利用中应用了绑定变量的局部持续同享游标,那些应用硬编码笔墨标量的局部从一些游标同享中获益。    cursor_sharing=SIMILAR能否会进步利用顺序机能依靠于上面成绩的谜底:  l 机能低下是因为十分大批的硬剖析形成的吗?  这能够经过监控几个目标来推断,如硬剖析的均匀数,剖析数/履行数,均匀呼应时光,会话的等候变乱等等。    l 在同享池中的应用硬编码笔墨标量的类似语句能否许多?  能够经过静态视图v$sql或v$sqlarea检查。  假如下面两个成绩的谜底都是确定的,那末cursor_sharing很能够会进步机能。    应用cursor_sharing=FORCE  鄙人面的情形下能够斟酌应用cursor_sharing=FORCE:  l 次最优化同享语句的比率十分高,使SIMILAR的感化不大  没有很轻松的方式找出次最优化语句的比率,除了测试全部的语句。别的一种方法是设置cursor_sharing=SIMILAR;假如硬剖析是因为没有类似语句没有连续的同享游标,而后有很多次最优化语句,FORCE是独一的处理计划。    l 利用有硬编码笔墨标量,而且在履行时光上有一些进化,逼迫类似语句应用雷同游标    当应用SIMIlAR没有关心的时间,斟酌FORCE作为最初的手腕是有效处的。    何时应当不应用cursor_sharing?  新近说起的(在“警告”一节中),有三种情形,应用cursor_sharing会有害处。那些情形下,没有任何能够应用某些cursor_sharing的值同享游标的类似语句,而且应用它只会增添剖析的消耗。  另一个要记着的事件是:cursor_sharing为面临一个应用了笔墨标量的利用顺序的DBA供给了一个处理计划。然而,它并不是替换应用绑定变量编写利用顺序,也能够采纳Oracle供给的其余优化。比方,利用顺序能够坚持频仍履行的剖析语句在翻开的游标中,而且在须要的时间,只是履行它们。如许的优化是基于深度的利用顺序常识,而且不能被cursor_sharing婚配。    论断  cursor_sharing的应用能够处理有硬剖析激发的机能成绩,如果利用顺序没有应用绑定变量。基于利用和数据库特征以及体系资本,参数应当被理智地设置。    附录:一些机能丈量  这一段描写了用Oracle 8i Release 2做的一个实验,考证cursor_sharing。  描写  这个实验的目标是做一个基础的考证。效劳器的最大吞吐量被一些客户端反复地公布一个繁多语句丈量。实验做了三次,采纳上面的特征:  1. 只应用绑定变量  有两个目标:树立一个基线;确保每个语句不会由于应用cursor_sharing影响机能。    2. 只应用笔墨标量,每个笔墨标量都有差别的笔墨  公布类似语句,冀望从cursor_sharing猎取最大的收益。    3. 每个笔墨标量都应用雷同的笔墨  并不冀望从cursor_sharing猎取收益,相同,冀望机能好转。来由是测试cursor_sharing软剖析的消耗。    在每种情形下只丈量剖析吞吐量(每秒钟的剖析量)。    成果  上面是测试成果:    Typecursor_sharing=EXACTcursor_sharing=FORCEBinds only26502650Similar statements86025001 statement with literalsg33002600Oracle 8.1.7 采纳cursor_sharing的剖析吞吐量(剖析数/秒)

上一篇:帝国CMS前台申请友情链接插件-网络编程

下一篇:没有了