国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫(kù) > Oracle > 正文

Oracle數(shù)據(jù)庫(kù)的優(yōu)化

2024-08-29 13:41:28
字體:
供稿:網(wǎng)友

  摘要 本文提出了一種優(yōu)化Oracle數(shù)據(jù)庫(kù)的方法。Oracle中SQL語句的執(zhí)行過程可分為解析(Parse)、執(zhí)行(Execute)和提取結(jié)果(Fetch)三步,此方法就是通過對(duì)SQL語句在Oracle數(shù)據(jù)庫(kù)中優(yōu)化執(zhí)行的三個(gè)過程來提高Oracle數(shù)據(jù)庫(kù)的性能。
  要害詞 數(shù)據(jù)庫(kù) 掃描 多表聯(lián)結(jié) 子查詢
  
  1 如何優(yōu)化Parse
  1. 1 SQL語句的Parse處理步驟:
  1) 計(jì)算語句值
  2) 共享池中有無與此語句值相同的語句?
  3) 共享池中有與此語句字符完全匹配的語句?
  4) 預(yù)備要運(yùn)行的SQL語句
  5) 為新語句在共享池中創(chuàng)建空間
  6) 將語句存放在共享池中
  7) 修改共享池圖,標(biāo)明語句的值和在共享池中的位置
  8) 執(zhí)行預(yù)備好的SQL語句
  最理想的是,語句只執(zhí)行1、2、3和8步來進(jìn)行處理。不經(jīng)過2、3步來測(cè)試被傳給Oracle的語句要使用1~8步進(jìn)行處理。只經(jīng)過1、2、3、8的SQL語句要比經(jīng)過1~8步的語句更為有效。
  1.2 在共享池中重用SQL語句
  當(dāng)SQL語句被傳遞給Oracle處理時(shí),其秘訣是重復(fù)使用已經(jīng)在共享池中的語句,而不是讓Oracle在接受語句時(shí)去預(yù)備新的語句。前面表明,假如Oracle接受了一個(gè)與共享池中的語句相一致的語句,就重用共享池中的語句。
  Oracle提供在數(shù)據(jù)庫(kù)中存儲(chǔ)代碼的能力。當(dāng)應(yīng)用系統(tǒng)開始運(yùn)行時(shí),從數(shù)據(jù)庫(kù)中讀取代碼(可用PL/SQL語句編制)并像其它語句那樣傳遞到共享池中去處理。從數(shù)據(jù)庫(kù)中取出的代碼是編譯過的并駐留在共享池中。
  可以利用數(shù)據(jù)庫(kù)中存儲(chǔ)的程序代碼設(shè)計(jì)應(yīng)用系統(tǒng),檢查所有的事務(wù)處理以及主要的通用的過程,研究現(xiàn)有的應(yīng)用系統(tǒng)并把主要的處理程序轉(zhuǎn)換為數(shù)據(jù)庫(kù)中存儲(chǔ)的程序代碼。在Oracle中存儲(chǔ)代碼可以通過過程、程序包、函數(shù)、觸發(fā)器等來實(shí)現(xiàn)。
  2 如何優(yōu)化Execute和Fetch
  2.1 避免無計(jì)劃的全表掃描
  全表掃描連續(xù)從表讀取所有數(shù)據(jù),而不管數(shù)據(jù)是否與查詢有關(guān)。避免不必要的全表掃描有兩個(gè)充足理由:1)全表掃描沒有選擇性
  2) 過全表掃描讀取的數(shù)據(jù)很快從SGA的緩沖區(qū)移走(假如正在掃描的表不是“高速存儲(chǔ)”的表)
  在基于規(guī)則優(yōu)化的情況下,假如下列任何條件在SGA語句出現(xiàn),就要對(duì)一個(gè)表進(jìn)行全表掃描。
  1) 該表無索引
  2) 對(duì)返回的行無任何限定條件(如無Where語句)
  3) 對(duì)數(shù)據(jù)表與任何索引主列相對(duì)應(yīng)的行無限定條件。例如,在City-State-Zip列上創(chuàng)建了三列復(fù)合索引,那么僅對(duì)State列有限定條件的查詢不能使用這個(gè)索引,因?yàn)镾tate不是索引的主列。
  4) 對(duì)索引主列的行有限定條件,但條件或者是NULL或者是不相等。例如,City列上存在索引,在所有下列情況下都不會(huì)使用索引。
  Where city is null
  Where city is not null
  Where city!=’liaoning’
  5) 對(duì)索引主列的行有限定條件,但條件在表達(dá)式里使用。例如,假如在City列上索引,那么限定條件
  Where City=’liaoning’
  可以使用索引。然而,假如限定條件是
  Where UPPER(City)=’liaoning’
  那么不會(huì)使用City列上的索引,因?yàn)镃ity列在UPPER函數(shù)里。假如將City列與文本字符串聯(lián)結(jié)在一起,也不會(huì)使用索引。例如,假如限定條件是
  Where City’x’ like ‘liaoning%’
  那么不會(huì)使用City列上的索引。
  6) 對(duì)索引主列的行有限定條件,但條件使用Like操作以及值以‘%’開始或者值是一個(gè)賦值變量。例如,在所有下列情況下都不會(huì)使用索引:
  Where City like ‘%aonin%’
  Where City like :City_Bind_Variable
  假如表小、索引列無選擇性,基于開銷的優(yōu)化器可能決定使用全表掃描。
  2.2只使用選擇性索引
  索引的選擇性是指索引列里不同值的數(shù)目與表中記錄數(shù)的比。假如表有1000個(gè)記錄,表索引列有950個(gè)不同值,那么這個(gè)索引的選擇性就是950/1000或者0.95。最好的可能性選擇是1.0。依據(jù)非空值列的唯一索引,通常其選擇性為1.0。
  假如使用基于開銷的最優(yōu)化,優(yōu)化器不應(yīng)該使用選擇性不好的索引。
  索引的選擇性是指索引列里不同值的數(shù)目與表中記錄數(shù)的比。假如表有1000個(gè)記錄,表索引列有950個(gè)不同值,那么這個(gè)索引的選擇性就是950/1000或者0.95。最好的可能性選擇是1.0。依據(jù)非空值列的唯一索引,通常其選擇性為1.0。
  索引的選擇性是指索引列里不同值的數(shù)目與表中記錄數(shù)的比。假如表有1000個(gè)記錄,表索引列有950個(gè)不同值,那么這個(gè)索引的選擇性就是950/1000或者0.95。最好的可能性選擇是1.0。依據(jù)非空值列的唯一索引,通常其選擇性為1.0。
  2.3治理多表聯(lián)結(jié)
  Oracle提供了3個(gè)聯(lián)結(jié)操作:NESTED LOOPS、HASH JOIN和MERGE JOIN。MERGE JOIN是一組操作,在所有行被處理完之前,它不返任何記錄給下一操作。NESTED LOOPS和HASH是行操作,因此會(huì)很快將第一批記錄返回給下一個(gè)操作。
  在每個(gè)聯(lián)結(jié)選項(xiàng)里,必須執(zhí)行一些步驟以獲取最好的聯(lián)結(jié)性能。假如沒有適當(dāng)?shù)貎?yōu)化聯(lián)結(jié)操作,那么聯(lián)結(jié)所需的時(shí)間也許隨著表的增長(zhǎng)而呈指數(shù)級(jí)地增長(zhǎng)。
  2.4治理包含視圖的SQL語句
  假如查詢包含視圖,優(yōu)化器有兩種執(zhí)行查詢的方法:首先解決視圖然后執(zhí)行查詢,或者把視圖文本集成到查詢里去。假如首先執(zhí)行視圖,那么首先完成全部的結(jié)果集,然后用其余的查詢條件做過濾器。
  首先解決視圖會(huì)導(dǎo)致查詢性能下降的問題,這取決于所涉及表的相對(duì)大小。
假如視圖被集成到查詢里,那么查詢的條件也可以應(yīng)用于視圖里,并且可以使用一個(gè)小一些的結(jié)果集。然而在一些情況下,也許可以通過視圖分離組操作提高查詢性能。
  假如一個(gè)視圖包含集合的操作(如Group by、SUM、COUNT或者DISTINCT),那么視圖不能被集成到查詢里去。
  不使用組或者沒有集合操作的視圖的SQL語法可以被集成到大的查詢里去。
  2.5優(yōu)化子查詢
  當(dāng)使用自查詢時(shí),也許會(huì)碰到幾個(gè)獨(dú)特的問題。涉及子查詢的查詢潛在問題如下:
   也許在執(zhí)行完查詢的剩余部分前執(zhí)行子查詢(與執(zhí)行分組功能的視圖相似)。
   子查詢也許要求特定的提示,但這些提示不直接與調(diào)用該子查詢的查詢有關(guān)
   可以作為單個(gè)查詢執(zhí)行的子查詢也許被代替寫成幾個(gè)不同的子查詢。
   也許在使用not in子句或者not exists子句時(shí),不能在最有效的方式下進(jìn)行子查詢的存在查詢。
  1)當(dāng)執(zhí)行子查詢時(shí)
  假如一個(gè)查詢包含子查詢,那么優(yōu)化器有兩種完成查詢的方法:首先完成子查詢,然后完成查詢(“視圖的方法”),或者將子查詢集成到查詢里去(“聯(lián)結(jié)”的方法)。假如首先解決子查詢,那么整個(gè)子查詢的結(jié)果集將首先被計(jì)算,并且用查詢條件的剩余部分做過濾器。假如沒有使用子查詢?nèi)ミM(jìn)行存在檢查,那么“聯(lián)結(jié)”方法將通常要比“視圖”方法完成得好。
  假如一個(gè)子查詢包括集合操作,如group by,SUM或者DISTINCT,那么不能集成子查詢到查詢的其余部分里去。非集成的子查詢限制了提供給優(yōu)化器的選項(xiàng)。
  2)如何組合子查詢
  一個(gè)查詢可以包含多個(gè)子查詢,使用的子查詢?cè)蕉啵苫蛘咧貙懰鼈兊酱蟮穆?lián)結(jié)里就越困難。既然有多個(gè)子查詢使集成困難,就應(yīng)該盡可能地組合多個(gè)子查詢。
  3)怎樣進(jìn)行存在檢查
  有時(shí)子查詢不返回行(記錄),但可以進(jìn)行數(shù)據(jù)正確性檢查。在相關(guān)表里的記錄或者存在或者不存在的邏輯檢查,稱為存在檢查。可以使用exists和not exists子句提高存在檢查的性能。
  2.6治理對(duì)非常巨大的表的訪問
  隨著表增長(zhǎng)到比SGA的數(shù)據(jù)塊高速緩沖區(qū)存儲(chǔ)器的空間顯著大時(shí),需要從另一個(gè)角度優(yōu)化對(duì)這個(gè)表的查詢。
  1)問題
  當(dāng)表和它的索引小的時(shí)候,在SGA里可以有高度的數(shù)據(jù)共享。多用戶讀表或索引范圍掃描可以反復(fù)使用同一個(gè)塊。隨著表的增長(zhǎng),表的索引也在增長(zhǎng)。隨著表和它的索引增長(zhǎng)到比SGA里提供的空間大時(shí),范圍掃描需要的下一行將在SGA里找到的可能性變小,數(shù)據(jù)庫(kù)的命中率將減小。最后,每一個(gè)邏輯讀將要求一個(gè)單獨(dú)的物理讀。對(duì)使用非常大的表的優(yōu)化方法著眼于非凡的索引技術(shù)和有關(guān)索引的選擇。
  2)治理數(shù)據(jù)接近
  在訪問非常大的表期間,假如傾向于繼續(xù)使用索引,那么應(yīng)該關(guān)注數(shù)據(jù)接近,即邏輯相關(guān)記錄的物理關(guān)系。為了使數(shù)據(jù)最大限度地接近,應(yīng)該連續(xù)往表里插入記錄。記錄按通常在表的范圍掃描里使用的列排序。
  3)避免沒有幫助的索引掃描
  假如要對(duì)大表使用索引掃描,那么不能假定索引掃描將比全表掃描執(zhí)行得更好。不緊跟表訪問的索引唯一掃描或范圍掃描執(zhí)行得比較好,但緊跟通過RowID的表訪問的索引范圍掃描也許執(zhí)行得差。隨著表增長(zhǎng)到比數(shù)據(jù)塊高速緩沖存儲(chǔ)器大得多,最終,索引掃描和全表掃描間的平衡點(diǎn)打破。
  4)創(chuàng)建充分索引的表
  假如表中的數(shù)據(jù)相當(dāng)穩(wěn)定,充分索引一個(gè)表是很有用的。創(chuàng)建一個(gè)復(fù)合索引,它包括所有在查詢期間通常選擇的列。在查詢期間,查詢要求的所有數(shù)據(jù)可以通過索引訪問提供,不需要任何表訪問。
  5)并行選項(xiàng)
  可以把一個(gè)數(shù)據(jù)庫(kù)任務(wù),比如Select語句,分為多個(gè)單元的工作,由多個(gè)Oracle進(jìn)程同時(shí)執(zhí)行。這種能夠答應(yīng)數(shù)據(jù)庫(kù)的單個(gè)查詢活動(dòng)由多個(gè)協(xié)調(diào)的進(jìn)程透明地進(jìn)行處理的能力,稱為并行查詢選項(xiàng)(PQO)。
  并行選項(xiàng)調(diào)用多個(gè)進(jìn)程來利用空閑的系統(tǒng)資源,以減少完成任務(wù)所需要的時(shí)間。并行選項(xiàng)并不減少處理過程所要求的資源數(shù)量,而是把處理的任務(wù)分散給多個(gè)CPU。為了從并行選項(xiàng)中得到最大的好處,應(yīng)該使CPU和磁盤上的I/O不要滿負(fù)荷使用。因?yàn)椴⑿械哪康氖鞘垢嗟腃PU和磁盤同時(shí)參與處理數(shù)據(jù)庫(kù)的命令,一個(gè)缺乏CPU和I/O資源的服務(wù)程序是不能從并行選項(xiàng)中得到好處的。
  2.7使用UNION ALL而不是UNION
  最常用的集操作是UNION操作,UNION操作使多個(gè)記錄集聯(lián)結(jié)成為單個(gè)集。UNION操作的數(shù)學(xué)定義是返回記錄的單個(gè)集并且沒有重復(fù)的行,所以在合并結(jié)果集里,Orac

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清水县| 九寨沟县| 图木舒克市| 隆昌县| 缙云县| 石嘴山市| 东阿县| 黔南| 和林格尔县| 吉木萨尔县| 平武县| 朝阳区| 宝兴县| 伊宁县| 青海省| 麟游县| 江川县| 丹寨县| 周宁县| 阿拉尔市| 贺州市| 高阳县| 萍乡市| 罗江县| 乌审旗| 临沧市| 蒲城县| 神木县| 白沙| 凉山| 灌阳县| 金阳县| 江川县| 分宜县| 江都市| 托里县| 南和县| 广德县| 大邑县| 潼关县| 开远市|