資源描述:
《sql優(yōu)化原則和技巧》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、SQL編寫及其優(yōu)化培訓(xùn)溫有飄2005年4月28日軟腦軟件(北京)公司17目錄本培訓(xùn)包含的內(nèi)容如下:41.表、索引相關(guān)知識及其在數(shù)據(jù)庫內(nèi)部相關(guān)的物理存儲41.1.數(shù)據(jù)庫中最小的物理存儲單位:塊(block)41.2.表數(shù)據(jù)在塊中的存儲以及RowId信息41.3.索引41.4.Bitmap索引介紹62.數(shù)據(jù)庫查詢操作的內(nèi)部處理過程62.1.數(shù)據(jù)庫的數(shù)據(jù)讀取是以塊為單位的62.2.查詢操作內(nèi)部過程以及索引的作用62.3.執(zhí)行計劃概念72.4.排序處理過程以及各種引起排序的操作72.5.多表join操作的內(nèi)
2、部過程73.寫SQL語句時在性能方面的目標83.1.select列表中減少不需要的數(shù)據(jù)83.2.from列表中去除不需要的表83.3.where條件中應(yīng)該考慮到索引的使用,避免一些寫法83.3.1.避免過濾字段中套用函數(shù),如果必須,則考慮函數(shù)索引93.3.2.避免把列放入表達式中去比較93.4.避免不需要的排序93.5.避免數(shù)據(jù)類型的隱式轉(zhuǎn)換93.6.程序代碼中的注意點103.6.1.由多個SQL語句完成的一個操作盡可能寫成一個SQL就完成,避免分解103.6.2.使用數(shù)據(jù)庫提供的約束來判斷某些錯誤
3、,如唯一性114.SQL語句知識114.1.SQL語句串講114.1.1.selectf1fromA114.1.2.selectf1fromAwheref2=v_1114.1.3.selectf1fromAorderbyf2114.1.4.selectsum(f1)fromA124.1.5.selectf2,sum(f1)fromAgroupbyf2124.1.6.selecta_f2,b_f2fromA,BwhereA.f1=B.f1124.1.7.Select*fromreportwhereSA
4、LES_CODEin(selectSALES_CODEfromankenwhere…);144.1.8.Select*fromreportwhereSALES_CODEexists(select1fromankenwhere…);144.1.9.in,exists的選擇144.1.10.selectyadfwast1,kopeewast2FromAunionallselectuufgerast1,poeprvcx17ast2fromB144.2.幾種常見操作或函數(shù)154.2.1.比較符like154
5、.2.2.isnull,isnotnull154.2.3.to_char,to_date,to_number154.2.4.nvl164.2.5.其他165.表設(shè)計的一些建議16參考文獻1617本培訓(xùn)包含的內(nèi)容如下:n表、索引相關(guān)知識及其在數(shù)據(jù)庫內(nèi)部相關(guān)的物理存儲;n數(shù)據(jù)庫查詢操作的內(nèi)部處理過程;n寫SQL語句時在性能方面的目標;nSQL語句知識;n表設(shè)計的一些建議下面闡述的內(nèi)容以O(shè)racle為例來講述的,在排版方面可能有不妥當(dāng)?shù)牡胤剑蛴行﹥?nèi)容前后重復(fù),但各種知識應(yīng)該比較容易理解和接受;1.表、索
6、引相關(guān)知識及其在數(shù)據(jù)庫內(nèi)部相關(guān)的物理存儲1.1.數(shù)據(jù)庫中最小的物理存儲單位:塊(block)數(shù)據(jù)庫最小的物理存儲單位是塊(9i默認是8k),每個塊只能屬于一個表;一行數(shù)據(jù)插入時會占用塊中的一些存儲,當(dāng)塊不能再容納新數(shù)據(jù)時,則將啟用新的塊存儲數(shù)據(jù);1.2.表數(shù)據(jù)在塊中的存儲以及RowId信息表的字段除了設(shè)計者設(shè)計的字段外,還有個字段Rowid;RowId是oracle為每個表自動增加的一個字段。當(dāng)表中插入一行記錄時,此記錄在塊就有一個唯一的物理位置,這個位置信息就保存在此行記錄的RowId字段;1.3
7、.索引表中記錄的存儲順序是以先后插入順序存儲的,在一個數(shù)據(jù)量很大的表中,如果不引入其他的手段,每次查找小部分記錄都是從第一條掃描到最后一條,這樣,系統(tǒng)將慢得不能使用;使用索引可以有效解決問題;如圖:17Report表(100萬條記錄)RowIdSession_codeSales_codeEmployee_code…AAANslAAQAAA7YTAAh100061000017AAANslAAYAAAAmWAAX10007100015。。?!饕鼸mployee_codeRowId5AAANslAA
8、YAAAAmWAAX17AAANslAAQAAA7YTAAh……索引的本質(zhì)用途是通過它使讀取進程在掃描源表時的數(shù)據(jù)塊范圍大大減小了,因此性能大幅度提高;一般情況下,當(dāng)檢索的記錄與所有記錄數(shù)比較<=4%時,索引是很有效的,當(dāng)比例更大時,索引反而有可能降低性能,因為即使使用了索引,讀取進程還是掃描了大部分的表中的塊,如果這樣,倒不如不用索引直接掃描源表,因為減少了讀取索引的塊的開銷;當(dāng)索引建好后,oracle優(yōu)化器在執(zhí)行sql時會選擇是否使用索引,所以設(shè)計表者不用擔(dān)心此索