高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》
生活随笔
收集整理的這篇文章主要介紹了
高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄:
Oracle數(shù)據(jù)完整性和鎖機(jī)制? 索引及優(yōu)化之表分析? 表分析、約束及表間關(guān)系? Oracle體系結(jié)構(gòu)1 Oracle體系結(jié)構(gòu)2? 海量數(shù)據(jù)庫(kù)及分區(qū)1? 海量數(shù)據(jù)庫(kù)及分區(qū)2? 海量數(shù)據(jù)庫(kù)及分區(qū)3? 海量數(shù)據(jù)庫(kù)及分區(qū)4? 高級(jí)SQL優(yōu)化(一)?? 高級(jí)SQL優(yōu)化(二)?? 高級(jí)SQL優(yōu)化(三) 常用優(yōu)化工具? PPT和源碼下載:???http://***/forum/posts/list/6365.html 配套視頻課程 Oracle性能優(yōu)化?http://***/product/601? 海量數(shù)據(jù)庫(kù)和高級(jí)SQL優(yōu)化?http://***/product/602 充分利用索引 索引的限制 1. 索引對(duì)不等號(hào)和NOT的限制 如果WHERE條件中出現(xiàn)!=或者<>,即使該列建立了索引,則該索引也不會(huì)被使用;如果不恰當(dāng)?shù)氖褂昧薔OT,則索引也不會(huì)被使用。 Oracle 10g起,在基于CBO的優(yōu)化器模式下Oralce會(huì)進(jìn)行自動(dòng)優(yōu)化,但在基于RBO(基于規(guī)則)的優(yōu)化器模式下,依然保持此規(guī)則。 1. 索引對(duì)不等號(hào)和NOT的限制 RBO模式下,執(zhí)行計(jì)劃如下: ? 1. 索引對(duì)不等號(hào)和NOT的限制 RBO模式下,執(zhí)行情況如下: 此時(shí)使用變通寫(xiě)法的耗費(fèi)為:0.407/2.187=1.60%! 1. 索引對(duì)不等號(hào)和NOT的限制 CBO模式下,執(zhí)行情況如下: 此時(shí)使用變通寫(xiě)法的耗費(fèi)節(jié)約不到0.03秒,但依然更優(yōu),故此推薦此種變通寫(xiě)法,再看此時(shí)使用NOT: 1. 索引對(duì)不等號(hào)和NOT的限制 CBO模式下,在JYJE列的索引上使用NOT: ? 為使用<>的:0.156/0.329=47.42%!為變通寫(xiě)法的使用0.156/0.297=52.53%! 因 此這種寫(xiě)法最優(yōu)! 1. 索引對(duì)不等號(hào)和NOT的限制 一般,WHERE條件中,如果索引列是字符列,使用NOT往往也不會(huì)使用索引: 結(jié)論:如果索引列是數(shù)字,則對(duì)于不等號(hào)的處理可以變更為NOT的方式或者(大于 OR 小于)的方式① ;對(duì)于確實(shí)無(wú)法不使用不等號(hào)的方式,可以使用默認(rèn)值② ;如果可以建立位圖索引則使用位圖索引③ ;否則可以考慮使用分區(qū)等方法進(jìn)行優(yōu)化④ ,具體是情況而定。 2. 索引對(duì)IS NULL的限制 一般來(lái)說(shuō),如果WHERE子句基于的列是可空的列,且其建立了索引,如果使用了IS NULL,由于NULL的列本身不包含在索引中,因此無(wú)法利用索引。 所以一般對(duì)要建立索引的列不要設(shè)置為可空,如果確實(shí)含有空值,建議使用默認(rèn)值代替空值,具體參見(jiàn)前面章節(jié)“SQL優(yōu)化技巧”部分的“使用默認(rèn)值”。 3. 索引對(duì)函數(shù)的限制 基于索引IDX_BIGTAB_OBJECTNAME,執(zhí)行情況如下: ? 執(zhí)行計(jì)劃情況如下: 這是因?yàn)樵撍饕浅R?guī)b-tree索引,對(duì)該列在WHERE子句中使用了函數(shù),則不能使用索引。因此,對(duì)在WHERE子句中經(jīng)常要使用函數(shù)時(shí),應(yīng)該建立基于函數(shù)的索引,且 只有當(dāng)查詢(xún)語(yǔ)句包含該函數(shù)或者表達(dá)式時(shí),基于函數(shù)的索引才會(huì)被調(diào) 用。詳情請(qǐng)參見(jiàn)索引部分的理論講解! 創(chuàng)建并使用函數(shù)索引: ? ? 創(chuàng)建并使用函數(shù)索引: 此時(shí)使用基于函數(shù)的索引效率是原來(lái)的2.782/0.188=14.78!唄! 4. 索引對(duì)不匹配數(shù)據(jù)類(lèi)型的限制 先看執(zhí)行情況: ? 不匹配的類(lèi)型執(zhí)行的時(shí)間是匹配的類(lèi)型的 2.187/0.266=8.2 倍! 再看執(zhí)行計(jì)劃: 原因分析: 因?yàn)锳CCOUNT_TRADE表的字段YKKH是CHAR,因此在對(duì)其指定的值是數(shù)字時(shí),Oracle雖然能隱式的執(zhí)行數(shù)字和字符的轉(zhuǎn)換,但不會(huì)調(diào)用其索引。而當(dāng)對(duì)其指定是字符時(shí),則不存在此問(wèn)題,索引可以調(diào)用。 注意:因?yàn)閿?shù)據(jù)類(lèi)型的不匹配和Oracle對(duì)數(shù)據(jù)類(lèi)型的隱式轉(zhuǎn)換,此種類(lèi)型的低效代碼在任何項(xiàng)目中均可能因?yàn)榇笠舛嬖?#xff0c;因此建議開(kāi)發(fā)人員和管理人員要定期抽查相應(yīng)的代碼,以杜絕此類(lèi)低效代碼! 索引類(lèi)型總結(jié)| 類(lèi)型 | ,描述 |
| b-tree索引 | 最常最多使用的索引,其樹(shù)結(jié)構(gòu)與二叉樹(shù)比較類(lèi)似,根據(jù)ROWID快速定位所訪問(wèn)的行 |
| bitmap索引 | 使用位圖來(lái)管理與數(shù)據(jù)行的對(duì)應(yīng)關(guān)系,適用于基數(shù)比較少的列 |
| 降序索引 | 降序索引在葉子節(jié)點(diǎn)中的存儲(chǔ)從左到右是按照從大到小排序的;一般是針對(duì)逆向排序較多的查詢(xún)時(shí)才使用該類(lèi)型索引 |
| 函數(shù)索引 | 針對(duì)要頻繁對(duì)列使用函數(shù)的索引,只有當(dāng)查詢(xún)語(yǔ)句包含該函數(shù)或者表達(dá)式時(shí),基于函數(shù)的索引才會(huì)被調(diào)用 |
| 反轉(zhuǎn)索引 | 反轉(zhuǎn)了b*tree索引碼中的字節(jié),使索引條目分配更均勻,多用于并行服務(wù)器環(huán)境下,用于減少索引的競(jìng)爭(zhēng) |
| 分區(qū)索引 | 分區(qū)表的索引,又包括本地分區(qū)索引(本地前綴分區(qū)索引和本地非前綴分區(qū)索引)和全局索引,一般建議使用本地分區(qū)索引,因其與基表具有良好的數(shù)據(jù)均衡性和可維護(hù)性 |
| 類(lèi)型 | 方式 | 發(fā)生條件 |
| 1.FULL INDEX SCANS | 逐一讀取索引中的所有塊,由于索引中數(shù)據(jù)已按索引鍵排序,因此會(huì)忽略掉排序 | 1.ORDER BY中的列全部在該索引中時(shí) 2.ORDER BY中列的順序滿足索引中前導(dǎo)列的順序時(shí) 3.使用GROUP BY且該子句中的列在索引中時(shí) |
| 2.FAST FULL INDEX SCANS | 只掃描索引中的數(shù)據(jù),不會(huì)掃描表中的數(shù)據(jù);由于索引中數(shù)據(jù)未按索引鍵排序,因此不能忽略掉排序 | 當(dāng)同時(shí)滿足下列條件是,Oracle用FFIS替代FIS: 1.查詢(xún)的所有列均包含在索引中 2.索引中的列至少一個(gè)具有not null約束 |
| 3.INDEX RANGE SCANS | 訪問(wèn)選擇性數(shù)據(jù)最常用的掃描方式;按順序的對(duì)某個(gè)索引進(jìn)行掃描,返回?cái)?shù)據(jù)是升序排列的,可以使用唯一索引和非唯一索引;如果對(duì)索引列使用ORDER BY/GROUP BY則可省略排序 | 1.在唯一索引上使用范圍操作符(>、<、>=、<=、<>、BETWEEN) 2.在組合索引上使用部分列進(jìn)行查詢(xún),導(dǎo)致查出多行 |
| 4.INDEX UNIQUE SCANS | 掃描唯一索引或主鍵,要么返回一行數(shù)據(jù)要么返回0行數(shù)據(jù) | 1.當(dāng)使用唯一索引時(shí) 2.當(dāng)使用主鍵時(shí) |
| 5.INDEX SKIP SCANS | 其實(shí)質(zhì)是將索引分解成多個(gè)小的子索引來(lái)提高效率,系從9i開(kāi)始引入 | 復(fù)合索引中前導(dǎo)列的取值是枚舉的從而可以分拆為多個(gè)子索引,并且查詢(xún)條件中不含前導(dǎo)列時(shí) |
| 項(xiàng)目 | 多個(gè)索引 | 復(fù)合索引 | 復(fù)合索引是多個(gè)索引的 |
| 一、執(zhí)行時(shí)間 | 0.281 | 0.11 | 39.15% |
| 二、執(zhí)行計(jì)劃 | ? | ? | ? |
| 1.總耗費(fèi) | 1658 | 464 | 27.99% |
| 2.I/O耗費(fèi) | 1562 | 462 | 29.58% |
| 3.時(shí)間 | 19 | 6 | 31.58% |
轉(zhuǎn)載于:https://www.cnblogs.com/liuzhuqing/archive/2013/02/04/7480629.html
總結(jié)
以上是生活随笔為你收集整理的高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2013应届毕业生“京北方”校招应聘总结
- 下一篇: 模拟alert,confirm,prom