Oracle在執(zhí)行一個(gè)SQL之前,首先需要看一下SQL的執(zhí)行計(jì)劃,然后在按照?qǐng)?zhí)行計(jì)劃執(zhí)行SQL,分析執(zhí)行計(jì)劃的工作是由優(yōu)化器來(lái)執(zhí)行的,在
Oracle在執(zhí)行一個(gè)SQL之前,首先需要看一下SQL的執(zhí)行計(jì)劃,然后在按照?qǐng)?zhí)行計(jì)劃執(zhí)行SQL,分析執(zhí)行計(jì)劃的工作是由優(yōu)化器來(lái)執(zhí)行的,在不同的條件下,一個(gè)SQL可能存在多條執(zhí)行計(jì)劃,但是在某個(gè)特定的時(shí)間點(diǎn),,特定的環(huán)境下,一定只有一種執(zhí)行計(jì)劃是最優(yōu)的。
一、優(yōu)化器的類(lèi)型:
oracle 的優(yōu)化方式有兩種,一種是基于規(guī)則的RBO(Rule-Based Optimization),一種是基于開(kāi)銷(xiāo)或者代價(jià)的CBO(Cost-Based Optimization)。
1. RBO: oracle在執(zhí)行查詢(xún)時(shí)遵循oracle內(nèi)部預(yù)定義的一些規(guī)則。
2. CBO:基于開(kāi)銷(xiāo)或者代價(jià)的執(zhí)行計(jì)劃,這里的開(kāi)銷(xiāo)是主要是指CPU和內(nèi)存的使用。優(yōu)化器在判斷是否用這種方式時(shí),主要參照的是表及索引的統(tǒng)計(jì)信息。統(tǒng)計(jì)信息給出表的大小、有少行、每行的長(zhǎng)度等信息。這些統(tǒng)計(jì)信息起初在庫(kù)內(nèi)是沒(méi)有的,是你在做analyze后才出現(xiàn)的,很多的時(shí)侯過(guò)期統(tǒng)計(jì)信息會(huì)令優(yōu)化器做出一個(gè)錯(cuò)誤的執(zhí)行計(jì)劃,因些我們應(yīng)及時(shí)更新這些信息。在Oracle8及以后的版本,Oracle列推薦用CBO的方式。
我們要明了,不一定走索引就是優(yōu)的 ,比如一個(gè)表只有兩行數(shù)據(jù),一次IO就可以完成全表的檢索,而此時(shí)走索引時(shí)則需要兩次IO,這時(shí)對(duì)這個(gè)表做全表掃描(full table scan)是最好的。
二、優(yōu)化器的優(yōu)化模式(Optermizer Mode)
優(yōu)化模式包括Rule,Choose,First rows,All rows這四種方式,也就是我們以上所提及的。如下我解釋一下:
Rule:不用多說(shuō),即走基于規(guī)則的方式。
Choolse:這是我們應(yīng)觀(guān)注的,默認(rèn)的情況下Oracle用的便是這種方式。指的是當(dāng)一個(gè)表或或索引有統(tǒng)計(jì)信息,則走CBO的方式,如果表或索引沒(méi)統(tǒng)計(jì)信息,表又不是特別的小,而且相應(yīng)的列有索引時(shí),那么就走索引,走RBO的方式。
First Rows:它與Choose方式是類(lèi)似的,所不同的是當(dāng)一個(gè)表有統(tǒng)計(jì)信息時(shí),它將是以最快的方式返回查詢(xún)的最先的幾行,從總體上減少了響應(yīng)時(shí)間。
All Rows:也就是我們所說(shuō)的Cost的方式,當(dāng)一個(gè)表有統(tǒng)計(jì)信息時(shí),它將以最快的方式返回表的所有的行,從總體上提高查詢(xún)的吞吐量。沒(méi)有統(tǒng)計(jì)信息則走基于規(guī)則的方式。
備注:查看執(zhí)行計(jì)劃,在plsql中按F5。如:
SELECT STATEMENT, GOAL = ALL_ROWS 7 4 72
MERGE JOIN CARTESIAN 7 4 72
TABLE ACCESS FULL CSMS Z_STUDENT 3 2 18
BUFFER SORT 4 2 18
TABLE ACCESS FULL CSMS Z_CLASS 2 2 18
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2
違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬(wàn)商天勤律師事務(wù)所王興未律師提供法律服務(wù)