SQL優化教程市公开课一等奖省赛课获奖课件_第1页
SQL優化教程市公开课一等奖省赛课获奖课件_第2页
SQL優化教程市公开课一等奖省赛课获奖课件_第3页
SQL優化教程市公开课一等奖省赛课获奖课件_第4页
SQL優化教程市公开课一等奖省赛课获奖课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SQL優化教程

SQL優化教程第1页SQL工作原理SQL性能檢測SQL優化技術目錄SQL優化教程第2页SQL工作原理一。資料庫性能外在表現:1.反應速度;2.響應時間;3.資源報警;二。資料庫性能內在原因:1.CPU2.內存3.I/O4.網絡二八标准:调整应用20%(关键部分),能处理80%问题SQL優化教程第3页SQL工作原理ORACLE架構SQL優化教程第4页SQL工作原理SQL執行過程SQL優化教程第5页SQL工作原理1.視圖轉換:將包括視圖查詢語句轉換為相應對基表查詢語句2.運算式轉換:將複雜SQL運算式轉換為較簡單等效連接運算式3.選擇優化器:不一样優化器普通產生不一样“執行計畫”4.選擇連接方式:

ORACLE有三種連接方式,對多表連接ORACLE可選擇適當連接方式5.選擇連接順序:對多表連接ORACLE選擇哪一對表先連接,選擇這兩表中哪個表做為源資料表6.選擇資料搜索路徑:根據以上條件選擇合適資料搜索路徑,如是選用全表搜索還是利用索引或是其它方式7.運行“執行計畫”:

注:資料庫緩存跟應用軟體緩存是兩碼事情資料庫緩存只有在資料庫伺服器端才存在,在用戶端是不存在。只有如此,才能夠保證資料庫緩存中內容跟資料庫檔內容一致。才能夠根據相關規則,预防資料髒讀、錯讀發生。而應用軟體所包括資料緩存,由於跟資料庫緩存不是一碼事情,所以,應用軟體資料緩存雖然能够提升資料查詢效率,不过,卻打破了資料一致性要求,有時候會發生髒讀、錯讀等情況發生。所以,有時候,在應用軟體上有專門一個功能,用來在必要時候去除資料緩存。不過,這個資料緩存去除,也只是去除本機上資料緩存,或者說,只是去除這個應用程式資料緩存,而不會去除資料庫資料緩存

SQL執行計劃內容SQL優化教程第6页SQL性能檢測取得SQL執行計劃目标:知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到索引名称.閱讀:按照从里到外,从上到下次序解读分析结果.EXPLAINPLAN分析结果是用缩进格式排列,最内部操作将被最先解读,假如两个操作处于同一层中,带有最小操作号将被首先执行.NESTEDLOOP是少数不按照上述规则处理操作,正确执行路径是检验对NESTEDLOOP提供数据操作,其中操作号最小将被最先处理(判断执行次序指导标准就是:最右、最上操作先执行).SQL優化教程第7页SQL性能檢測方法一:经过explainplanfor语句

0.创建Explain_plan表$ORACLE_HOME/rdbms/admin/utlxplan.sql1.清空分析结果表Truncatetableplan_table;2.分析语句explainplanforselect*fromtable_name;3.查看执行计划select*fromtable(dbms_xplan.display);獲得SQL執行計劃方法SQL優化教程第8页SQL性能檢測方法二:

SETAUTOTRACE(一)。配置AUTOTRACE(SYS)@$ORACLE_HOME/rdbms/admin/utlxplan.sql@$ORACLE_HOME/sqlplus/admin/plustrce.sqlgrantselectonv_$sessiontoplustrace;grantplustracetopublic;在10g中带有plan_table这张表,不过将名字改为了plan_table$,只需$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色和grantplustracetopublic;(二)。設置Autotrace命令1.SETAUTOTRACEOFF此為預設值,即關閉Autotrace2.SETAUTOTRACEONEXPLAIN只顯示執行計畫3.SETAUTOTRACEONSTATISTICS

只顯示執行統計資訊4.SETAUTOTRACEON包含2,3兩項內容(執行計畫和統計資訊)5.SETAUTOTRACETRACEONLY

與ON相同,但不顯示語句執行結果

settimingon顯示執行時間(三)。Autotrace執行計畫各列涵義1

ID_PLUS_EXP

每一步驟行號2

PARENT_ID_PLUS_EXP

每一步Parent級別號,显示每一个步骤与父步骤之间关系3

PLAN_PLUS_EXP

實際每步4

OBJECT_NODE_PLUS_EXP

显示数据连接和所使用并行查询服务器(Dblink或並行查詢時才會用到)獲得SQL執行計劃方法SQL優化教程第9页SQL性能檢測方法二:

SETAUTOTRACE(四)。AUTOTRACEStatistics惯用列解釋1

recursivecalls迴圈遞歸次數2dbblockgets

從buffercache中讀取block數量2

consistentgets

從buffercache中讀取undo資料block數量3

physicalreads

從磁片讀取block數量4

redosize

DML生成redo大小(byte)bytessentviaSQL*Nettoclient发送给客户端总字节数bytesreceivedviaSQL*Netfromclient经过OracleNet从客户接收总字节数SQL*Netroundtripsto/fromclient发送给客户和从客户接收OracleNet消息总数sorts(memory)

在記憶體執行排序量sorts(disk)

在磁片上執行排序量rowsprocessed在操作过程中处理行数獲得SQL執行計劃方法SQL優化教程第10页SQL性能檢測方法三:

SQL_TRACE(一)。在全局启用在参数文件(pfile/spfile)中指定:SQL_TRACE=true会造成全部进程活动被跟踪,包含后台进程及全部用户进程,这通常会造成比较严重性能问题,慎重使用(二)。在当前session级设置启用当前session跟踪:altersessionsetSQL_TRACE=true;或executedbms_session.set_sql_trace(true);结束跟踪:altersessionsetSQL_TRACE=false;或executedbms_session.set_sql_trace(false);(三)。跟踪其它用户进程取得进程信息,选择需要跟踪进程:selectsid,serial#,usernamefromv$sessionwhereusername=‘***’;设置跟踪:execdbms_system.set_SQL_TRACE_in_session(9,437,true);停顿跟踪:execdbms_system.set_SQL_TRACE_in_session(9,437,false);獲得SQL執行計劃方法SQL優化教程第11页SQL性能檢測方法四:

10046事件Oracle提供内部事件,是对SQL_TRACE增强,设置以下四个级别:0----tracing被关闭,相当于设置sql_trace=false1---启用标准SQL_TRACE功效,等价于SQL_TRACE。4---Level1加上绑定值(bindvalues)8--–Level1+等候事件跟踪12--Level1+Level4+Level8(一)。在全局启用在参数文件中增加:EVENT="10046tracenamecontextforever,level12“(二)。在当前session级设置经过altersession方式修改,需要altersession系统权限启用当前session跟踪:altersessionsetevents'10046tracenamecontextforever';或altersessionsetevents'10046tracenamecontextforever,level8';结束跟踪:altersessionsetevents'10046tracenamecontextoff';(三)。跟踪其它用户进程经过DBMS_SYSTEM.SET_EV系统包来实现:取得进程信息,选择需要跟踪进程:selectsid,serial#,usernamefromv$sessionwhereusername=‘***’;设置跟踪:execdbms_system.set_ev(9,437,10046,8,'eygle');停顿跟踪:execdbms_system.set_ev(9,437,10046,0,'eygle');獲得SQL執行計劃方法SQL優化教程第12页SQL性能檢測其它方法:

execsys.dbms_support.start_trace;execsys.dbms_support.start_trace(waits=>TRUE,binds=>TRUE)execsys.dbms_support.stop_trace;execsys.dbms_system.set_bool_param_in_session(sid=>1234,serial#=>56789,parnam=>'TIMED_STATISTICS',bval=>true);execsys.dbms_system.set_int_param_in_session(sid=>1234,serial#=>56789,parnam=>'MAX_DUMP_FILE_SIZE',intval=>2147483647);execdbms_support.start_trace_in_session(sid=>1234,serial#=>56789,waits=>true,binds=>true);execdbms_support.stop_trace_in_session(sid=>1234,serial#=>56789);altersystemsettimed_statistics=true;oradebugsetospid12345;Oradebugunlimit;Oradebugevent10046tracenamecontextforever,level8;Oradebugevent10046tracenamecontextoff;----ORACLE10gexecutedbms_monitor.session_trace_enable(1234,56789,true,true);--sid,serialexecutedbms_monitor.session_trace_disable(1234,56789);execute

dbms_monitor.serv_mod_act_trace_enable('APPS1','GLEDGER','DEBIT_ENTRY',TRUE,TRUE,NULL);-----开启级别12跟踪已知服务,模块,和动作Executedbms_monitor.serv_mod_act_trace_disable('APPS1','GLEDGER','DEBIT_ENTRY');

獲得SQL執行計劃方法SQL優化教程第13页SQL性能檢測生成跟踪文件位于“user_dump_dest”参数所指定目录1.查询当前session跟踪文件:Selectd.Value||'/'||Lower(Rtrim(i.Instance,Chr(0)))||'_ora_'||p.Spid||'.trc'Trace_File_Name

From(Selectp.Spid

FromV$mystatm,V$sessions,V$processp

Wherem.Statistic#=1

Ands.Sid=m.Sid

Andp.Addr=s.Paddr)p,(Selectt.Instance

FromV$threadt,V$parameterv

Wherev.Name='thread'

And(v.Value=0Ort.Thread#=To_Number(v.Value)))i,(Select

Value

FromV$parameter

Where

Name='user_dump_dest')d获取方法三/四跟踪文件SQL優化教程第14页SQL性能檢測2.查询其它用户session跟踪文件

(依据用户sid和#serial):Selectd.Value||'/'||Lower(Rtrim(i.Instance,Chr(0)))||'_ora_'||p.Spid||'.trc'Trace_File_Name

From(Selectp.Spid

FromV$sessions,V$processp

Wheres.Sid='44'

Ands.Serial#='8805'

Andp.Addr=s.Paddr)p,(Selectt.Instance

FromV$threadt,V$parameterv

Wherev.Name='thread'

And(v.Value=0Ort.Thread#=To_Number(v.Value)))i,(Select

Value

FromV$parameter

Where

Name='user_dump_dest')d获取方法三/四跟踪文件SQL優化教程第15页SQL性能檢測(一)。用oracle自带tkprof命令行工具格式化:tkprofinput-file-nameoutput-file-namesys=no;(1)input-file-name:SQLTracefilename,如:ora_app_9930.trc(2)output-file-name:tkrof執行結果檔案(3)sys=no:不分析SYSuser所下語法,所以內容純粹為User所下SQL語法(二)。欄位解釋

callcountcpuelapseddiskquerycurrentrows---------------------------------------------------------------------------Parse10.000.000000Execute10.000.000000Fetch20.000.00218314--------------------------------------------------------------------------total40.000.00218314SQLStatements3階段:Parse:包含了软分析(重用一个已经分析过查询方案--在SHARED_POOL中找到语句)和硬分析(分析一个带有硬编码变量语句)Execute:对SELECT几乎为空,对UPDATE则几乎是全部工作表达;Fetch:对SELECT是几乎全部工作,对UPDATE则为空Oracle利用内部hash算法来取得该sqlhash值,然后在librarycache里查找是否存在该hash值;假设存在,则将此sql与cache中进行比较;假设“相同”,就将利用已经有解析树与执行计划,而省略了优化器相关工作。这也就是软解析过程。诚然,假如上面2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划动作。这个过程就叫硬解析格式化跟踪文件SQL優化教程第16页SQL性能檢測Count:事件发生次数cpu:Server所處理時間,單位為秒,若時間為0,表示執行時間短到測不出來,或initSID.ora中,參數timed_statistics=false(此參數需設為true)elapsed:总体运行时间disk:硬碟I/O次數query:一致读模式访问块数,也包含了从回滚段读取块数current:Memoryhit筆數,访问当前信息数据块(而不是一致读模式),比如SELECT时读取数据字典内容rows:總共處理資料筆數格式化跟踪文件SQL優化教程第17页SQL性能檢測注意现象:1).高PARSECOUNT/EXECUTECOUNT(靠近100%),且EXECUTECOUNT大于1即执行语句时分析次数,假如过高,可能是软分析也过多了,对一个会话,应该是分析一次重复执行2).对几乎全部SQL,EXECUTECOUNT都是1可能没有使用绑定变量。在一个真实应用中,应该极少看到不一样SQL,同一个SQL应执行屡次3).

CPU和ELAPSED时间相差较大说明花了很长时间等候一个事件,比如磁盘I/O、锁等4).(FETCHCOUNT)/(ROWSFETCHED)百分比高没有很好使用批量提取。批量提取数据方法是和语言/API相关,比如Pro*C中需要使用prefetch=NN预编译,Java/JDBC下能够调用SETROWPREFETCH方法,PL/SQL能够在SELECTINTO中直接使用BULKCOLLECT.而SQL*PLUS缺省为每次取15行5).极大DISKCOUNT较难推断,但若DISKCOUNT=QUERY+CURRENTMODEBLOCKCOUNT,则说明几乎全部数据都来自磁盘。此时需要考虑SGA大小和此查询效率6).极大QUERYCOUNT或CURRENTCOUNT

SQL工作量很大,需要注意格式化跟踪文件SQL優化教程第18页SQL性能檢測即使任何SQL语句都能够用explain解释,但对于没有查询INSERT,UPDATE,DELETE操作来说,这个工具并没有太大用处。没有子查询INSERT操作不会创建执行计划,但没有WHERE子句或子查询UPDATE和DELETE操作会创建执行计划,因为这些操作必须先找出所要统计。另外,假如你在SQL语句中使用其它类型如sequence等,explain也能揭示它使用方法。

explain真正唯一限制是用户不能去解释其它用户表,视图,索引或其它类型,用户必须是全部被解释事物全部者,假如不是全部者而只有select权限,explain会返回一个错误。執行計劃限制SQL優化教程第19页SQL性能檢測1.FullTableScan(FTS)全表扫描

读取表中全部行,并检验每一行是否满足语句WHERE限制条件。Oracle次序地读取分配给表每个数据块,直到读到表最高水线处(highwatermark,HWM,标识表最终一个数据块)

一次I/O能读取多块数据块在较大表上不提议使用全表扫描,除非取出数据比较多,超出总量5%--10%,或你想使用并行查询功效时2.IndexScan或IndexLookup索引扫描或索引查找先经过index查找到数据对应rowid值(对于非唯一索引可能返回多个rowid值),然后依据rowid直接从表中得到详细数据一次I/O只能读取一个数据块在索引中,除了存放每个索引值外,索引还存放含有此值行对应ROWID值。索引扫描能够由2步组成:(1)扫描索引得到对应rowid值。(2)经过找到rowid从表中读出详细数据。每步都是单独一次I/O,不过对于索引,因为经常使用,绝大多数都已经CACHE到内存中,所以第1步I/O经常是逻辑I/O,即数据能够从内存中得到。不过对于第2步来说,假如表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时间。所以假如多大表进行索引扫描,取出数据假如大于总量5%--10%,使用索引扫描会效率下降很多2.1.indexuniquescan索引唯一扫描

经过唯一索引查找一个数值经常返回单个ROWID。假如该唯一索引有多个列组成(即组合索引),则最少要有组合索引引导列参加到该查询中表访问方式(搜索路徑)

SQL優化教程第20页SQL性能檢測2.2.indexrangescan索引范圍扫描/索引局部扫描

使用一个索引存取多行数据

a.为唯一索引列上使用了范围操作符(>,<,>=,<=等)

b.在组合索引上,只使用了部分列进行查询,造成查询出多行c.对非唯一索引列上进行任何查询2.3.indexfullscan索引全扫描/索引全局扫描

查列全在索引中(只在CBO模式下才有效)條件中含Orderby2.4.indexfastfullscan索引快速全扫描/索引快速全局扫描

查列全在索引中

不带orderby情况下常发生是对全表扫描替换办法。快速全扫描只是访问索引本身数据,而不需要进行全表访问。而此种方式与索引全扫描方式一个显著区分是快速全扫描并不是以排序次序被访问,也就是返回数据并不是排序次序

能够使用多块读功效,也能够使用并行读入2.5.indexskipscan索引跳跃扫描

条件列是非索引前导列情况下常发生3.TableAccessbyrowid或rowidlookup物理ID扫描

行ROWID指出了该行所在数据文件、数据块以及行在该块中位置,所以经过ROWID来存取数据能够快速定位到目标数据上,是Oracle存取单行数据最快方法

一次I/O只能读取一个数据块

表访问方式SQL優化教程第21页SQL性能檢測join是一个试图将两个表结合在一起谓词,一次只能连接2个表,表连接也能够被称为表关联,

Join过程各个步骤经常是串行操作,即使相关rowsource能够被并行访问,即能够并行读取做join连接两个rowsource数据,不过在将表中符合限制条件数据读入到内存形成rowsource后,join其它步骤普通是串行。有各种方法能够将2个表连接起来,当然每种方法都有自己优缺点,每种连接类型只有在特定条件下才会发挥出其最大优势根据2个rowsource连接条件中操作符不一样,能够将连接分为a).等值连接(如WHEREA.COL3=B.COL4)b).非等值连接(WHEREA.COL3>B.COL4)c).外连接(WHEREA.COL3=B.COL4(+))不论连接操作符怎样,经典连接类型共有3种:

排序--合并连接(SortMergeJoin(SMJ))

嵌套循环(NestedLoops(NL))

哈希连接(HashJoin)优化器对于表连接决定主要是在于:表连接次序,表连接方法,中间连接结果访问路径表连接方式

SQL優化教程第22页SQL性能檢測1.SortMergeJoin(SMJ)排序合并连接内部连接过程:首先生成rowsource1需要数据,然后对这些数据按照连接操作关联列(如A.col3)进行排序。随即生成rowsource2需要数据,然后对这些数据按照与sortsource1对应连接操作关联列(如B.col4)进行排序。最终两边已排序行被放在一起执行合并操作,即将2个rowsource按照连接条件连接起来

下面是连接步骤图形表示:

MERGE

/

\

SORT

SORT

|

|

RowSource1

RowSource2在缺乏数据选择性或者可用索引时

,排序合并连接将比嵌套循环连愈加高效,相比嵌套循环连接,排序合并连接比较适合用于返回大数据量结果只能用于等价连接表连接方式

SQL優化教程第23页SQL性能檢測2.NestedLoops(NL)嵌套循环

内部连接过程:

Rowsource1Row1--------------

--Probe->

Rowsource2

Rowsource1Row2--------------

--Probe->

Rowsource2

Rowsource1Rown--------------

--Probe->

Rowsource2读取rowsource1中每一行,然后在rowsourc2中检验是否有匹配行,全部被匹配行都被放到结果集中,然后处理rowsource1中下一行。这个过程一直继续,直到rowsource1中全部行都被处理,此时保持rowsource1尽可能小与高效访问rowsource2(普通经过索引实现)是影响这个连接效率关键问题假如drivingrowsource(外部表)比较小,而且在innerrowsource(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法能够得到很好效率。NESTEDLOOPS有其它连接方法没有一个优点是:能够先返回已经连接行,而无须等候全部连接操作处理完才返回数据,这能够实现快速响应时间最好驱动表是那些应用了where限制条件后,能够返回较少行数据表(并行查询,经常选择大表作为驱动表,因为大表能够充分利用并行功效)能够使用hint

USE_NL(T1,T2)来让执行计划按照设定表连接次序执行表连接方式SQL優化教程第24页SQL性能檢測3.HashJoin哈希连接

oracle7.3以后引入,只用在CBO优化器中,最为高效一个连接方式较小rowsource被用来在内存中构建基于连接键哈希表(hashtable)与bitmap,再扫描表连接中第2个rowsource,与哈希表进行匹配,假如有相关联数据,则将数据添加到结果集中,当使用ORDERED提醒时,FROM子句中第一张表将用于建立哈希表当缺乏有用索引时,哈希连接比嵌套循环连接愈加有效,哈希连接可能比排序合并连接更加快,因为在这种情况下只有一张源表需要排序。哈希连接也可能比嵌套循环连接更加快,因为处理内存中哈希表比检索B_树索引愈加快速只能用于等价连接能够使用hintUSE_HASH来强制优化器选择哈希连接表连接方式SQL優化教程第25页SQL性能檢測4.

CartesianProduct笛卡儿乘积当两个rowsource做连接,不过它们之间没相关联条件时,就会在两个rowsource中做笛卡儿乘积,是一个表每一行依次与另一个表中全部行匹配在特殊情况下我们能够使用笛卡儿乘积,如在星形连接中表连接方式SQL優化教程第26页SQL性能檢測表连接比较类别嵌套循环连接排序合并连接哈希连接优化器提醒USE_NLUSE_MERGEUSE_HASH使用条件任何连接主要用于不等价连接,如<、<=、>、>=;仅用于等价连接相关资源CPU、磁盘I/O内存、暂时空间内存、暂时空间特点当有高选择性索引或进行限制性搜索时效率比较高,能够快速返回第一次搜索结果。当缺乏索引或者索引条件含糊时,排序合并连接比嵌套循环有效。在数据仓库环境下,假如表纪录数多,效率高。缺点当索引丢失或者查询条件限制不够时,效率很低;当表纪录数多时,效率低。全部表都需要排序。它为最优化吞吐量而设计,而且在结果没有全部找到前不返回数据。为建立哈希表,需要大量内存。第一次结果返回较慢。SQL優化教程第27页SQL性能檢測1.查操作系統系統塊大小Windows:fsutilfsinfontfsinfoc:Linux:tune2fs-l/dev/sda2|grepBlock2.查Oracle數據塊大小和在全表或全索引扫描时一次读取数据块数目:Select*FromV$parameterWhere

Name

In('db_block_size','db_file_multiblock_read_count');查塊大小SQL優化教程第28页SQL優化技術一。網絡方面:1.使用存放过程,可消除客户机/服务器应用中无须要网络传输;2.減少連線:dblink

因使用dblink完后但沒有及時關閉,造成sessioni過多,佔用資源.請各位在程式中使用完dblink后,加入以下語句,即可關閉dblink所產生session:altersessionclosedatabaselinkdblinkname;

另:這是erp系統物管組(pb)寫一個function,用來關閉session,供大家參考:f_close_dblinkstringls_sql

longll_count,ll_return=0

ls_sql='altersessionclosedatabaselink'+as_link_name

executeimmediate:ls_sql;SQL優化教程第29页SQL優化技術二。內存方面:1.減少排序:需要進行排序操作:

a、創建索引;

b、包括到索引維護並行插入

c、order

by或者group

by(盡可能對索引欄位排序)

d、Distinct

e、union/intersect/minus

f、sort-merge

join

g、analyze命令(僅可能使用estamate而不是compute)對於全部session,用做排序記憶體量都是一樣,當排序空間需求超出了sort_area_size大小時,這時將會在TEMP表空間中分頁進行磁片排序。磁片排序要比記憶體排序大约慢14,000倍。磁片排序開銷是很大,有幾個方面原因。首先,和記憶體排序相比較,它們特別慢;而且磁片排序會消耗臨時表空間中資源。Oracle還必須分配緩衝池塊來保持臨時表空間中塊。磁片排序將會令任務變慢,並且會影響Oracle實例當前任務執行。SQL優化教程第30页SQL優化技術三。I/O方面:1.消除无须要大表全表搜索:无须要全表搜索造成大量无须要I/OSQL優化教程第31页SQL優化技術四。SQL方面:1.SQL共享:SQL语句必须完全相同(包含空格,换行等)。判断SQL语句是否与共享内存中某一SQL相同步骤:1).对所发出语句文本串进行hashed。假如hash值与已在共享池中SQL语句hash值相同,则进行第2步:2)将所发出语句文本串(包含大小写、空白和注释)与在第1步中识别全部已存在SQL语句相比较。比如:

SELECT*FROMempWHEREempno=1000;

和以下每一个都不一样

SELECT*fromempWHEREempno=1000;

SELECT*FROMEMPWHEREempno=1000;

SELECT*FROMempWHEREempno=;

在上面语句中列值都是直接SQL语句中,这类sql成为硬编码SQL或字面值SQL比如:

a.该2个sql语句被认为相同

selectpin,namefrompeoplewherepin=:blk1.pin;

selectpin,namefrompeoplewherepin=:blk1.pin;

b.该2个sql语句被认为不相同

selectpin,namefrompeoplewherepin=:blk1.ot_ind;

selectpin,namefrompeoplewherepin=:blk1.ov_ind;

这类语句称为绑定变量SQL。3).将所发出语句中包括对象与第2步中识别已存在语句所包括对象相比较。比如:

如用户user1与用户user2下都有EMP表,则

用户user1发出语句:SELECT*FROMEMP;与

用户user2发出语句:SELECT*FROMEMP;被认为是不相同语句,

因为两个语句中引用EMP不是指同一个表。4).在SQL语句中使用捆绑变量捆绑类型必须一致。SQL優化教程第32页SQL優化技術2.干预执行计划:使用hints提醒用hints来实现:使用优化器类型

基于代价优化器优化目标,是all_rows还是first_rows。

表访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。

表之间连接类型

表之间连接次序

语句并行程度

怎样使用hints:

Hints只应用在它们所在sql语句块(statementblock,由select、update、delete关键字标识)上,对其它SQL语句或语句其它部分没有影响。如:对于使用union操作2个sql语句,假如只在一个sql语句上有hints,则该hints不会影响另一个sql语句。

我们能够使用注释(comment)来为一个语句添加hints,一个语句块只能有一个注释,而且注释只能放在SELECT,UPDATE,orDELETE关键字后面使用hints语法:

{DELETE|INSERT|SELECT|UPDATE}/*+hint[text][hint[text]]...*/

or

{DELETE|INSERT|SELECT|UPDATE}--+hint[text][hint[text]]...

注解:

1)DELETE、INSERT、SELECT和UPDATE是标识一个语句块开始关键字,包含提醒注释只能出现在这些关键字后面,不然提醒无效。

2)“+”号表示该注释是一个hints,该加号必须马上跟在”/*”后面,中间不能有空格。

3)hint是下面介绍详细提醒之一,假如包含多个提醒,则每个提醒之间需要用一个或多个空格隔开。

4)text是其它说明hint注释性文本5)假如在查询中使用了表别名,在hint也要用表别名来代替表名

假如你没有正确指定hints,Oracle将忽略该hints,而且不会给出任何错误。使用全套hints:不但指定要使用索引,而且也指定连接方法与连接次序等

SQL優化教程第33页SQL優化技術指示优化器方法与目标hints:

/*+ALL_ROWS*/基于代价优化器,以吞吐量为目标

/*+FIRST_ROWS(n)*/基于代价优化器,以响应时间为目标/*+CHOOSE*/依据是否有统计信息,选择不一样优化器

/*+RULE*/

使用基于规则优化器指示存放路径hints:

/*+FULL(table)*/

指定该表使用全表扫描/*+ROWID(table)*/

指定对该表使用rowid存取方法,该提醒用较少/*+CLUSTER(table)*/指定对该表使用族掃描存取方法,只对簇对象有效/*+INDEX(table[index])*/使用该表上指定索引对表进行索引扫描/*+INDEX_ASC(table[index])*/使用该表上指定索引对表进行索引升序扫描/*+INDEX_FFS(table[index])*/

使用快速全表扫描

/*+NO_INDEX(table[index])*/

不使用该表上指定索引进行存取,依然能够使用其它索引进行索引扫描

/*+INDEX_COMBINE*/为指定表选择位图访问路经,如中没有提供作为参数索引,将选择出位图索引布尔组合方式

/*+INDEX_JOIN(table[index])*/提醒明确命令优化器使用索引作为访问路径

/*+INDEX_DESC(table[index])*/对表选择索引降序扫描方法SQL優化教程第34页SQL優化技術指示其它hints:/*+ADD_EQUALtableindex1,index2,…*/提醒明确进行执行规划选择,将几个单列索引扫描合起来

/*+USE_CONCAT*/对查询中WHERE后面OR条件进行转换为UNIONALL组合查询

/*+NO_EXPAND*/对于WHERE后面OR或者IN-LIST查询语句,将阻止其基于优化器对其进行扩展

/*+NOWRITE*/禁止对查询块查询重写操作

/*+REWRITE*/能够将视图作为参数/*+MERGE(TABLE)*/能够对视图各个查询进行对应合并

/*+NO_MERGE(TABLE)*/对于有可合并视图不再合并

/*+CACHE(TABLE)*/当进行全表扫描时,将表检索块放置在缓冲区缓存中最近最少列表LRU最近使用端

/*+NOCACHE(TABLE)*/当进行全表扫描时,将表检索块放置在缓冲区缓存中最近最少列表LRU最近使用端

/*+APPEND*/直接插入到表最终,能够提升速度

/*+NOAPPEND*/经过在插入语句生存期内停顿并行模式来开启常规插入

/*+PARALLEL(table,number)*/SQL優化教程第35页SQL優化技術指示连接次序hints:

/*+ORDERED*/

按from字句中表次序从左到右连接/*+STAR*/

指示优化器使用星型查询

/*+DRIVING_SITE(TABLE)*/强制与所选择位置不一样表进行查询执行

/*+LEADING(TABLE)*/将指定表作为连接次序中首表指示连接类型hints:/*+USE_NL(table[,table,...])*/

使用嵌套连接,并把指定表作为内部表/*+USE_MERGE(table[,table,...])*/

使用排序--合并连接

/*+USE_HASH(table[,table,...])*/

使用HASH连接注意:假如表有alias(别名),则上面table指是表别名,而不是真实表名

SQL優化教程第36页SQL優化技術造成提醒无效条件提醒被忽略条件cluster与非簇表一同使用hash与非簇表一同使用hash_aj不存在子查询index指定索引不存在index_combine不存在位图索引merge_aj不存在子查询parallel

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论