數(shù)據(jù)庫程序員面試分類真題15_第1頁
數(shù)據(jù)庫程序員面試分類真題15_第2頁
數(shù)據(jù)庫程序員面試分類真題15_第3頁
數(shù)據(jù)庫程序員面試分類真題15_第4頁
數(shù)據(jù)庫程序員面試分類真題15_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)庫程序員面試分類真題15簡答題1.

執(zhí)行計(jì)劃里的access和filter有什么區(qū)別?正確答案:如下所示:

PredicateInformation(identifiedbyop(江南博哥)erationid):

-------------------------------------------------------

4-access("A""EMPNO"="B"."MGR")

filter("A"."EMPNO"="B"."MGR")

5-filter("B"."MGR"ISNOTNULL)

一般而言,access表示這個謂詞條件的值將會影響數(shù)據(jù)的訪問路徑(表還是索引);filter表示謂詞條件的值不會影響數(shù)據(jù)的訪問路徑,只起到過濾的作用。NOTIN或MIN函數(shù)等容易產(chǎn)生filter操作。

對于filter而言,如果只有一個子節(jié)點(diǎn),那么就是簡單過濾操作(獨(dú)立操作)。如果有兩個或更多子節(jié)點(diǎn),那么就是類似NestedLoops操作,只不過與NestedLoops差別在于,filter內(nèi)部會構(gòu)建HASH表,對于重復(fù)匹配的,不會再次進(jìn)行循環(huán)查找,而是利用已有結(jié)果,提高效率。但是一旦重復(fù)匹配的較少,循環(huán)次數(shù)多,那么,filter操作將嚴(yán)重影響性能的操作,可能會導(dǎo)致目標(biāo)SQL幾天都執(zhí)行不完。[考點(diǎn)]SQL優(yōu)化

2.

統(tǒng)計(jì)信息包括哪幾類?正確答案:Oracle數(shù)據(jù)庫里的統(tǒng)計(jì)信息是一組存儲在數(shù)據(jù)字典里,且從多個維度描述了數(shù)據(jù)庫里對象的詳細(xì)信息的一組數(shù)據(jù)。當(dāng)Oracle數(shù)據(jù)庫工作在CBO(CostBasedOptimization,基于代價的優(yōu)化器)模式下時,優(yōu)化器會根據(jù)數(shù)據(jù)字典中記錄的對象的統(tǒng)計(jì)信息來評估SQL語句的不同執(zhí)行計(jì)劃的成本,從而找到最優(yōu)或者是相對最優(yōu)的執(zhí)行計(jì)劃。所以,可以說,SQL語句的執(zhí)行計(jì)劃由統(tǒng)計(jì)信息來決定,若沒有統(tǒng)計(jì)信息則會采取動態(tài)采樣的方式來生成執(zhí)行計(jì)劃。統(tǒng)計(jì)信息決定著SQL的執(zhí)行計(jì)劃的正確性,屬于SQL執(zhí)行的指導(dǎo)思想。

統(tǒng)計(jì)信息主要包括6種類型,其中表、列和索引的統(tǒng)計(jì)信息也可以統(tǒng)稱為普通對象的統(tǒng)計(jì)信息,如下圖所示。

[考點(diǎn)]統(tǒng)計(jì)信息

3.

Oracle10g和11g的自動統(tǒng)計(jì)信息收集機(jī)制有哪些不同?正確答案:在Oracle10g之前并沒有自動收集統(tǒng)計(jì)信息的機(jī)制,從Oracle10g開始引入了自動收集統(tǒng)計(jì)信息的功能,這個功能在Oracle10g中被稱為自動統(tǒng)計(jì)信息收集(AutomaticStatisticsGathering),在Oracle11g中被稱為自動優(yōu)化器統(tǒng)計(jì)信息收集(AutomaticOptimizerStatisticsCollection)。自動統(tǒng)計(jì)信息收集作業(yè)能夠每天收集普通對象和數(shù)據(jù)字典的統(tǒng)計(jì)信息,但不會收集x$系列表的內(nèi)部對象統(tǒng)計(jì)信息。Oracle的初始化參數(shù)STATISTICS_LEVEL控制收集統(tǒng)計(jì)信息的級別,有三個參數(shù)值:

1)BASIC:收集基本的統(tǒng)計(jì)信息。

2)TYPICAL:收集大部分統(tǒng)計(jì)信息(數(shù)據(jù)庫的默認(rèn)設(shè)置)。

3)ALL:收集全部統(tǒng)計(jì)信息。

當(dāng)使用Oracle自動收集統(tǒng)計(jì)信息時,必須要確保Oracle的參數(shù)STATISTICS_LEVEL的值為TYPICAL或者ALL。默認(rèn)值為TYPICAL,該值可以確保數(shù)據(jù)庫自我管理功能所需求的所有主要統(tǒng)計(jì)信息的正確收集,及提供最好的綜合性能。這個默認(rèn)值能勝任大多數(shù)的環(huán)境,并且Oracle不推薦去修改該值。

DBA可以根據(jù)Oracle提供的腳本$ORACLE_HOME/rdbms/admin/catmwin.sql查看統(tǒng)計(jì)信息收集作業(yè)的整體搭建流程。有興趣的讀者可以研究下此腳本的內(nèi)容。

Oracle10g和11g的自動統(tǒng)計(jì)信息收集機(jī)制有所不同,詳見下表。

在Oracle11g中對統(tǒng)計(jì)信息自動收集的功能進(jìn)行了加強(qiáng)。在Oracle10g中,如果表中變更的行數(shù)(字典表SYS.MON_MODS_ALL$中記錄的INSERT+UPDATE+DELETE的總數(shù))超過表的總行數(shù)(SYS.TABS中記錄的目標(biāo)表總記錄數(shù))的10%時或自上次自動統(tǒng)計(jì)信息收集作業(yè)完成之后目標(biāo)表被執(zhí)行過TRUNCATE操作,那么Oracle就會在指定時間段自動收集統(tǒng)計(jì)信息。在Oracle10g中,這個10%(STALE_PERCENT)是無法修改的,如果表非常大,那么10%其實(shí)是非常多的數(shù)據(jù),這就造成統(tǒng)計(jì)信息不準(zhǔn)確。在Oracle11g中,這個10%(STALE_PERCENT)是可以修改的,分為全局(DBMS_STATS.SET_GLOBAL_PREFS)、數(shù)據(jù)庫級別(DBMS_STATS.SET_DATABASE_PREFS)、用戶級別(DBMS_STATS.SET_SCHEMA_PREFS)和表級別(DBMS_STATS.SET_TABLE_PREFS)。其中,數(shù)據(jù)庫級別和用戶級別都是調(diào)用表級別的存儲過程DBMS_STATS.SET_TABLE_PREFS來對表進(jìn)行設(shè)置的。

表級別的設(shè)定如下:

1)修改為5%(范圍為1~100):EXECDBMS_STATS.SET_TABLE_PREFS(USER,'TB_NAME',''STALL_PERCENT',5);

2)恢復(fù)為10%:EXECDBMS_STATS.SET_TABLE_PREFS(USER,'TB_NAME','STALE_PERCENT',NULL);

3)查詢表百分比:SELECTDBMS_STATS.GET_PREFS('STALE_PERCENT',USER,'TB_NAME')FROMDUAL;

4)查詢?nèi)职俜直龋篠ELECTDBMS_STATS.GET_PREFS('STALE_PERCENT')FROMDUAL;

Oracle10g的自動統(tǒng)計(jì)信息收集功能沒有資源限制,但Oracle11g的統(tǒng)計(jì)信息收集功能在資源管理上面限制了對系統(tǒng)資源使用,其對應(yīng)的RESOURCE_PLAN的名稱為DEFAULT_MAINTENANCE_PLAN。用戶可以根據(jù)各自系統(tǒng)的業(yè)務(wù)場景來配置是否開啟自動收集統(tǒng)計(jì)信息,也可以調(diào)整窗口調(diào)度的開始時間、持續(xù)時間和資源組限制等。

DBA_TAB_MODIFICATIONS視圖(基表為SYS.MON_MODS_ALL$)記錄了從上次收集統(tǒng)計(jì)信息以來表中DML操作變化的數(shù)據(jù)量,包括執(zhí)行INSERT、UPDATE和DELETE影響的行數(shù),以及是否執(zhí)行過TRUNCATE操作。該特性依賴于表的MONITORING屬性是否打開,可以查詢DBA_TABLES視圖的MONITORING列獲取該屬性值。另外,DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO可以將內(nèi)存中的數(shù)據(jù)快速刷新到數(shù)據(jù)字典SYS.MON_MODS_ALL$中。[考點(diǎn)]統(tǒng)計(jì)信息

4.

怎樣收集表的統(tǒng)計(jì)信息?怎樣收集分區(qū)表的統(tǒng)計(jì)信息?正確答案:主要采用DBMS_STATS.GATHER_TABLE_STATS包進(jìn)行統(tǒng)計(jì)信息的收集,如下:

DBMS_STATS.GATHER_TABLE_STATS(USER,'TB_NAME',CASCADE=>TRUE);--普通表

DBMS_STATS.GATHER_TABLE_STATS(USER,'TB_NAME',PARTNAME=>'PT_PART_NAME',GRANULARITY=>'PARTITION',CASCADE=>TRUE);--針對分區(qū)表的單個分區(qū)進(jìn)行收集統(tǒng)計(jì)信息

除此之外,還有一些其他的用法,如下:

1)EXECDBMS_STATS.GATHER_DATABASE_STATS(USER);——收集當(dāng)前數(shù)據(jù)庫下所有用戶的統(tǒng)計(jì)信息。

2)EXECDBMS_STATS.GATHER_SCHEMA_STATS(USER);——收集當(dāng)前數(shù)據(jù)庫用戶下所有對象的統(tǒng)計(jì)信息。

當(dāng)系統(tǒng)的分區(qū)表數(shù)據(jù)量很大時,如果每次都收集全部的分區(qū)必然會導(dǎo)致統(tǒng)計(jì)信息的收集非常慢,在Oracle11g之后可以通過設(shè)置INCREMENTAL來只針對數(shù)據(jù)有變動的分區(qū)做收集:

EXECDBMS_STATS.SET_TABLE_PREFS(USER,'TABLE_NAME','INCREMENTAL','TRUE');--只收集數(shù)據(jù)變動的分區(qū)

SELECTDBMS_STATS.GET_PREFS('INCREMENTAL',NULL,'TABLE_NAME')FROMDUAL;

--查看分區(qū)表INCREMENTAL的值[考點(diǎn)]統(tǒng)計(jì)信息

5.

什么是動態(tài)采樣(DynamicSampling)?正確答案:對于沒有收集統(tǒng)計(jì)信息的表,Oracle為了能夠得到相對準(zhǔn)確的執(zhí)行計(jì)劃,會在執(zhí)行SQL之前對SQL語句涉及的表做動態(tài)采樣(DynamicSampling,從Oracle11gR2開始稱為DynamicStatistic)。

有兩種方法可以開啟動態(tài)采樣:

1)將參數(shù)OPTIMIZER_DYNAMIC_SAMPLING的值設(shè)為大于或等于1。從Oracle10g開始,該值默認(rèn)為2,若設(shè)置為0,則禁用動態(tài)采樣。

2)使用動態(tài)采樣的Hint:DYNAMIC_SAMPLING(TLEVEL)。該Hint表示對目標(biāo)表T強(qiáng)制使用等級為參數(shù)level指定值的動態(tài)采樣。

默認(rèn)采樣數(shù)據(jù)塊數(shù)量受隱含參數(shù)“_OPTIMIZER_DYN_SMP_BLKS”的控制,其默認(rèn)值是32,表示動態(tài)采樣時默認(rèn)采樣數(shù)據(jù)塊數(shù)量為32。[考點(diǎn)]統(tǒng)計(jì)信息

6.

動態(tài)采樣的作用有哪幾個方面?正確答案:引入動態(tài)采樣有如下幾方面的作用:

1)CBO依賴的是充分的統(tǒng)計(jì)信息,但是并不是每個用戶都會非常認(rèn)真、及時地去對每個表做分析。為了保證執(zhí)行計(jì)劃都盡可能地準(zhǔn)確,Oracle需要使用動態(tài)采樣技術(shù)來幫助CBO獲取盡可能多的信息。

2)全局臨時表。通常來講,臨時表的數(shù)據(jù)是不做分析的,但是當(dāng)一個查詢關(guān)聯(lián)到這樣的臨時表時,CBO要想獲得臨時表上的統(tǒng)計(jì)信息分析數(shù)據(jù),就只能依賴于動態(tài)采樣了。

3)為了相對準(zhǔn)確地估算出當(dāng)目標(biāo)SQL語句WHERE條件中出現(xiàn)有關(guān)聯(lián)關(guān)系的列時整個WHERE條件的組合可選擇率,進(jìn)而能相對準(zhǔn)確地估算出返回結(jié)果集的Cardinality。動態(tài)采樣除了可以在段對象沒有分析時,給CBO提供分析數(shù)據(jù)之外,還可以對不同列之間的相關(guān)性做統(tǒng)計(jì)。[考點(diǎn)]統(tǒng)計(jì)信息

7.

直方圖(Histogram)的意義是什么?直方圖的適用場合有哪些?正確答案:在Oracle數(shù)據(jù)庫中,CBO會默認(rèn)認(rèn)為目標(biāo)列的數(shù)據(jù)在其最小值(LOW_VALUE)和最大值(HIGH_VALUE)之間是均勻分布的,并且會按照這個均勻分布原則來計(jì)算對目標(biāo)列施加WHERE查詢條件后的可選擇率以及結(jié)果集的Cardinality,進(jìn)而據(jù)此來計(jì)算成本值并選擇執(zhí)行計(jì)劃。但目標(biāo)列的數(shù)據(jù)是均勻分布這個原則并不總是正確的,在實(shí)際的系統(tǒng)中,可以很容易地發(fā)現(xiàn)有一些目標(biāo)列的數(shù)據(jù)分布是不均勻的,甚至是極度傾斜、分布極度不均衡的。對這樣的列如果還按照均勻分布的原則去計(jì)算可選擇率與Cardinality,并據(jù)此來計(jì)算成本、選擇執(zhí)行計(jì)劃,那么CBO所選擇的執(zhí)行計(jì)劃就可能是不合理的,甚至是錯誤的,所以此時應(yīng)該收集列的直方圖。

直方圖是一種列的特殊的統(tǒng)計(jì)信息,主要用來描述列上的數(shù)據(jù)分布情況。當(dāng)數(shù)據(jù)分布傾斜時,直方圖可以有效地提升Cardinality評估的準(zhǔn)確度。構(gòu)造直方圖最主要的原因就是幫助優(yōu)化器在表中數(shù)據(jù)嚴(yán)重偏斜時做出更好的規(guī)劃。例如,表中的某個列上,其中的某個值占據(jù)了數(shù)據(jù)行的80%(數(shù)據(jù)分布傾斜),相關(guān)的索引就可能無法幫助減少滿足查詢所需的I/O數(shù)量。創(chuàng)建直方圖可以讓基于成本的優(yōu)化器知道何時使用索引才最合適,或何時應(yīng)該根據(jù)WHERE子句中的值返回表中80%的記錄。如果對目標(biāo)列收集了直方圖,那么意味著CBO將不再認(rèn)為該目標(biāo)列上的數(shù)據(jù)是均勻分布的了,CBO就會用該目標(biāo)列上的直方圖統(tǒng)計(jì)信息來計(jì)算對該列施加查詢條件后的可選擇率和返回結(jié)果集的Cardinality,進(jìn)而據(jù)此計(jì)算成本并選擇相應(yīng)的執(zhí)行計(jì)劃。

通常情況下在以下場合中建議使用直方圖:

1)當(dāng)WHERE子句引用了列值分布存在明顯偏差的列時:當(dāng)這種偏差相當(dāng)明顯時,以至于WHERE子句中的值將會使優(yōu)化器選擇不同的執(zhí)行計(jì)劃,這時應(yīng)該使用直方圖來幫助優(yōu)化器來修正執(zhí)行路徑。(注意:若查詢不引用該列,則在該列上創(chuàng)建直方圖沒有意義。)

2)當(dāng)列值導(dǎo)致不正確的判斷時,這種情況通常會發(fā)生在多表連接時。例如,假設(shè)有一個五張表的連接操作,其目標(biāo)SQL最終結(jié)果集只有10行。Oracle將會以一種使第一個連接的結(jié)果集(集合基數(shù))盡可能小的方式將表連接起來。通過在中間結(jié)果集中攜帶更少的負(fù)載,查詢將會運(yùn)行得更快。為了使中間結(jié)果最小化,優(yōu)化器嘗試在SQL執(zhí)行的分析階段評估每個結(jié)果集的集合基數(shù)。在偏差的列上擁有直方圖將會極大地幫助優(yōu)化器做出正確的決策。如優(yōu)化器對中間結(jié)果集的大小做出不正確的判斷,則它可能會選擇一種未達(dá)到最優(yōu)化的表連接方法。因此向該列添加直方圖經(jīng)常會向優(yōu)化器提供使用最佳連接方法所需的信息。[考點(diǎn)]統(tǒng)計(jì)信息

8.

直方圖存儲的數(shù)據(jù)字典表有哪些?正確答案:直方圖實(shí)際上存儲在數(shù)據(jù)字典基表SYS.HISTGRMS中,可以通過數(shù)據(jù)字典DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS和DBA_SUBPART_HISTOGRAMS來分別查看表、分區(qū)表的分區(qū)和分區(qū)表的子分區(qū)的直方圖統(tǒng)計(jì)信息。[考點(diǎn)]統(tǒng)計(jì)信息

9.

直方圖有哪些類型?正確答案:Oracle數(shù)據(jù)庫里的直方圖使用了一種稱為Bucket(桶)的方式來描述目標(biāo)列的數(shù)據(jù)分布。Bucket(桶)是一個邏輯上的概念,相當(dāng)于分組,每個Bucket就是一組,每個Bucket里會存儲一個或多個目標(biāo)列中的數(shù)據(jù)。Oracle會用兩個維度來描述一個Bucket,這兩個維度分別是ENDPOINT_NUMBER和ENDPOINT_VALUE,Oracle會將每個Bucket的這兩個維度記錄在數(shù)據(jù)字典基表SYS.HISTGRM$中。列的直方圖的類型可以通過查詢視圖DBA_TAB_COL_STATISTICS的HISTOGRAM列來獲取,一般情況下包含3類:None(沒有直方圖)、Frequency(頻率直方圖,也叫等頻直方圖)、HeightBalanced(高度平衡直方圖,也叫等高直方圖)。在Oracle12c中,又新增了兩種類型的直方圖,分別是頂級頻率直方圖(TopFrequencyHistogram)和混合直方圖(HybridHistogram)。本書只討論頻率和高度平衡直方圖。

(1)頻率(Frequency,F(xiàn)req)直方圖

在Oracle12c之前,如果存儲在數(shù)據(jù)字典里描述目標(biāo)列直方圖的Bucket的數(shù)量等于目標(biāo)列的DISTINCT值的數(shù)量,那么這種類型的直方圖就是頻率(Frequency)直方圖。頻率直方圖只適用于那些目標(biāo)列的DISTINCT值數(shù)量小于或等于254的情形。需要注意的是,在Oracle12c中頻率直方圖所對應(yīng)的Bucket的數(shù)量可以超過254。

對于頻率直方圖而言,目標(biāo)列直方圖的Bucket的數(shù)量等于目標(biāo)列的DISTINCT值的數(shù)量,此時目標(biāo)列有多少個DISTINCT值,Oracle在數(shù)據(jù)字典DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS、DBA_SUBPART_HISTOGRAMS(分別對應(yīng)于表、分區(qū)和子分區(qū)的直方圖統(tǒng)計(jì)信息)中就會存儲多少條記錄,每一條記錄就代表了對其中的一個Bucket的描述,上述數(shù)據(jù)字典中的字段ENDPOINT_VALUE記錄了這些DISTINCT值,而字段ENDPOINT_NUMBER則記錄了到此DISTINCT值為止總共有多少條記錄。需要注意的是,對頻率直方圖而言,ENDPOINT_NUMBER是一個累加值,可以用一條記錄的ENDPOINT_NUMBER值減去它上一條記錄的ENDPOINT_NUMBER值來得到這條記錄本身所對應(yīng)的ENDPOINT_VALUE值的記錄數(shù),SQL如下:

SELECTSAL,COUNT(*)COUNTS,SUM(COUNT(*))OVER(ORDERBYSALRANGEUNBOUNDEDPRECEDING)CURR_ROWSFROMT_ST_20170604_LHRTGROUPBYT.SAL;--從表中獲取累加值

SELECTTABLE_NAME,COLUMN_NAME,ENDPOINT_NUMBER,ENDPOINT_VALUE,NVL((ENDPOINT_NUMBER-(LAG(ENDPOINT_NUMBER)OVER(ORDERBYENDPOINT_VALUE))),ENDPOINT_NUMBER)COUNTSFROMDBA_TAB_HISTOGRAMSWHERETABLE_NAME='T_ST_20170604_LHR';

--從直方圖中獲取分組記錄數(shù)

(2)高度平衡(HeightBalanced,HtBal)直方圖

如果存儲在數(shù)據(jù)字典里描述目標(biāo)列直方圖的Bucket的數(shù)量小于目標(biāo)列的DISTINCT值的數(shù)量,那么這種類型的直方圖就是高度平衡(HeightBalanced)直方圖。在高度平衡直方圖中,執(zhí)行計(jì)劃的列的選擇性沒有頻率直方圖精確,而在現(xiàn)實(shí)很多時候,列的唯一值是超過254的,那么只能使用高度平衡直方圖。在高度平衡直方圖中,DBA_TAB_HISTOGRAMS視圖中的EDNPOINT_NUMBER代表桶號,且自動省去與EDNPOINT_VALUE值相同且與ENDPOINT_NUMBER相鄰的桶的值。ENDPOINT_VALUE表示每一個桶中的最大值,而第一個桶記錄的是最小值(Bucket為0的行,即EDNPOINT_NUMBER為0的行)。重復(fù)出現(xiàn)為ENDPOINT_VALUE的值稱為PopularValue。若PopulValue所在記錄的ENDPOINT_NUMBER值和它上一條記錄的ENDPOINT_NUMBER值之間的差值越大,則意味著該P(yáng)opularValue在目標(biāo)表中所占的比例也就越大,它所對應(yīng)的Cardinality也就越大。在高度平衡直方圖中,除了最后1個桶可能包含的數(shù)據(jù)比其他的桶少以外,所有其他的桶包含相同數(shù)量的值,其值為目標(biāo)表總記錄數(shù)除以Bucket的數(shù)量。

(3)頻率和高度平衡直方圖的比對

頻率直方圖高度平衡直方圖簡介目標(biāo)列直方圖的Bucket的數(shù)量=目標(biāo)列的DISTINCT值的數(shù)量目標(biāo)列直方圖的Bucket的數(shù)量<目標(biāo)列的DISTINCT值的數(shù)量使用場合頻率直方圖只適用于那些目標(biāo)列的DISTINCT值數(shù)量小于或等于254的情形在高度平衡直方圖中,除了最后1個桶可能包含的數(shù)據(jù)比其他的桶少以外,所有其他的桶包含相同數(shù)量的值,其值為目標(biāo)表總記錄數(shù)除以Bucket的數(shù)量ENDPOINT_VALUE的含義若為數(shù)值類型則代表不同的DISTINCT值;若為字符類型則記錄的是DISTINCT值轉(zhuǎn)換后的值若為數(shù)值類型則表示每一個桶中的最大值,而第一個桶記錄的是最小值(Bucket為0的行,即EDNPOINT_NUMBER為0的行);若為字符類型則記錄的是轉(zhuǎn)換后的值ENDPOINT_NUMBER的含義記錄了到此DISTINCT值為止累加的行數(shù)代表桶號,且自動省去與EDNPOINT_VALUE值相同且與ENDPOINT_NUMBER相鄰的桶的值(節(jié)省空間,合并存儲)[考點(diǎn)]統(tǒng)計(jì)信息

10.

如何收集直方圖?正確答案:默認(rèn)情況下,數(shù)據(jù)庫會為列收集基本統(tǒng)計(jì)信息,但不會收集直方圖信息。Oracle通過指定DBMS_STATS的METHOD_OPT參數(shù)來創(chuàng)建直方圖。METHOD_OPT參數(shù)可以接受如下的輸入值:

FORALL[INDEXED|HIDDEN]COLUMNS[size_clause]

FORCOLUMNS[size_clause]column|attribute[size_clause][,column|attribute[size_clause]...]

其中的size_clause必須符合如下的格式:

SIZE{integer|REPEAT|AUTO|SKEWONLY}

含義如下:

1)SKEWONLY:只對數(shù)據(jù)分布不均衡的列收集直方圖統(tǒng)計(jì)信息。

2)REPEAT:只對已經(jīng)有直方圖統(tǒng)計(jì)信息的列收集直方圖統(tǒng)計(jì)信息。

3)AUTO:讓Oracle白行決定是否對目標(biāo)列收集直方圖統(tǒng)計(jì)信息,以及使用哪種類型的直方圖。

4)integer:直方圖的Bucket的數(shù)量,必須在1~254的范圍內(nèi),1表示刪除該目標(biāo)列上的直方圖統(tǒng)計(jì)信息。

METHOD_OPT參數(shù)的默認(rèn)值為“FORALLCOLUMNSSIZEAUTO”,“FORALLCOLUMNSSIZE1”表示刪除所有列直方圖統(tǒng)計(jì)信息。下面是一些常用的收集方法:

1)對T表上所有有索引的列以自動收集的方式收集直方圖:FORALLINDEXEDCOLUMNSSIZEAUTO。

2)對T表上的列A和列B以自動收集的方式收集直方圖:FORCOLUMNSSIZEAUTOAB。

3)對T表上的列A和列B收集直方圖統(tǒng)計(jì)信息,同時指定BUCKET數(shù)量均為10:FORCOLUMNSSIZE10AB。

4)對T表上的列A和列B收集直方圖統(tǒng)計(jì)信息,同時指定列A的BUCKET數(shù)量為10,列B的BUCKET數(shù)量為5:FORCOLUMNSASIZE10BSIZE5。

5)只刪除表T上列A的直方圖統(tǒng)計(jì)信息:FORCOLUMNSASIZE1。

6)刪除表T上所有列的直方圖統(tǒng)計(jì)信息:FORALLCOLUMNSSIZE1。

如果需要刪除某個列SAL的直方圖信息,在Oracle10g中可以通過設(shè)置“METHOD_OPT=>'FORCOLUMNSSALSIZE1'”,但這卻得再次收集表的統(tǒng)計(jì)信息,十分不合理。所以,在Oracle11g中,有如下方法可以直接刪除直方圖信息:

EXECDBMS_STATS.DELETE_COLUMN_STATS(USER,'T_ST_20170604_LHR','SAL',COL_STAT_TYPE=>'HISTOGRAM');

其中,COL_STAT_TYPE默認(rèn)為ALL,表示刪除列的基本統(tǒng)計(jì)信息和直方圖信息。[考點(diǎn)]統(tǒng)計(jì)信息

11.

基表COL_USAGE$的作用是什么?正確答案:從Oracle9i開始引入了SYS.COLUSAGE$表用來跟蹤列的使用情況,該功能通過隱含參數(shù)“_COLUMN_TRACKING_LEVEL”來控制。若隱含參數(shù)“_COLUMN_TRACKING_LEVEL”的值為0則取消該功能,若隱含參數(shù)“_COLUMN_TRACKING_LEVEL”的值為1則表示該功能生效。默認(rèn)情況下,該功能是生效的,并且CBO負(fù)責(zé)將SQL語句中WHERE條件的查詢謂詞信息保存在該表中,數(shù)據(jù)庫在執(zhí)行SHUTDOWNNORMAL或者SHUTDOWNIMMEDIATE會自動將該表中的數(shù)據(jù)清空。[考點(diǎn)]統(tǒng)計(jì)信息

12.

新建索引后統(tǒng)計(jì)信息是否自動收集?正確答案:在Oracle10g后有個隱含參數(shù)“_OPTIMIZER_COMPUTE_INDEX_STATS”,意思是是否對新建索引收集統(tǒng)計(jì)信息,該參數(shù)默認(rèn)是TRUE,表示默認(rèn)收集新建索引的統(tǒng)計(jì)信息。[考點(diǎn)]統(tǒng)計(jì)信息

13.

什么是基數(shù)反饋(CardinalityFeedback)?正確答案:基數(shù)反饋(CardinalityFeedback,CFB)是Oracle11gR2出現(xiàn)的一個新特性,它的出現(xiàn)是為了幫助Oracle優(yōu)化器依據(jù)更精準(zhǔn)的基數(shù)生成更加優(yōu)秀的執(zhí)行計(jì)劃?;鶖?shù)的評估準(zhǔn)確與否,對于優(yōu)化器異常重要,直接影響到后續(xù)的JOINCOST等重要的成本計(jì)算評估。若評估不當(dāng)則會造成CBO選擇不當(dāng)?shù)膱?zhí)行計(jì)劃。此技術(shù)對于僅執(zhí)行一次的SQL無效,在SQL第一次執(zhí)行時,記錄存儲實(shí)際的基數(shù)和評估的基數(shù)之間的差異,如果差異較大,在第二次執(zhí)行時,優(yōu)化器會依據(jù)實(shí)際的基數(shù)重新決策生成執(zhí)行計(jì)劃,但是需要注意的是,當(dāng)使用更準(zhǔn)確的基數(shù)重新生成執(zhí)行計(jì)劃時,生成的執(zhí)行計(jì)劃與第一次時使用的執(zhí)行計(jì)劃完全有可能是相同的。這個技術(shù)的出現(xiàn)是由于優(yōu)化器在一些情況下不能很好地去計(jì)算基數(shù)的數(shù)值,比如統(tǒng)計(jì)信息缺失或陳舊、多謂詞、直方圖缺失等。

Oracle只針對下面情況開啟CFB:

1)沒有收集表的統(tǒng)計(jì)信息,并且動態(tài)采樣(DynamicSampling)也沒有開啟。

2)查詢條件復(fù)雜(比如條件有函數(shù))或者涉及多列,但卻沒有收集擴(kuò)展的統(tǒng)計(jì)信息(ExtendedStatistics)。

在這幾種情況下,CBO是無法估算出準(zhǔn)確的Cardinality的。針對上述情況,Oracle會監(jiān)控操作的實(shí)際行數(shù)(A-Row),然后對比CBO估算的行數(shù)(E-Row)。如果兩個值相差很大,那么就記錄實(shí)際行數(shù)(A-Row),做上標(biāo)記。下次執(zhí)行時再次進(jìn)行硬解析,根據(jù)實(shí)際行數(shù)來重新生成執(zhí)行計(jì)劃。如果兩個值相差不大,那么CBO就不再監(jiān)控這條SQL語句。

Oracle11gR2針對此特性,也專門在V$SQL_SHARED_CURSOR中增加了USE_FEEDBACK_STATS列來記錄SQL是否使用了基數(shù)反饋?;鶖?shù)反饋的開啟和關(guān)閉通過一個隱含參數(shù)“_OPTIMIZER_USE_FEEDBACK”來控制,該參數(shù)默認(rèn)為TRUE,表示開啟基數(shù)反饋特性。此參數(shù)除了可以在SESSION和SYSTEM級別進(jìn)行設(shè)置之外,還可以在SQL語句級使用Hint進(jìn)行開啟和關(guān)閉,如下:

SELECT/*+OPT_PARAM('_OPTIMIZER_USE_FEEDBACK''FALSE')*/COUNT(*)FROMTEST;

SELECT/*+OPT_PARAM('_OPTIMIZER_USE_FEEDBACK''TRUE')

*/COUNT(*)FROMTEST;

需要注意的是,如果動態(tài)采樣被啟用,那么是不會使用基數(shù)反饋特性的。若使用了該特性則在執(zhí)行計(jì)劃的Note部分可以看到“cardinalityfeedbackusedforthisstatement”字樣?;鶖?shù)反饋在Oracle12c上得到更進(jìn)一步的擴(kuò)展,稱為統(tǒng)計(jì)反饋(StatisticsFeedback),并且成為Oracle12c自動重新優(yōu)化(AutomaticReoptimization)的一部分。但是由于CFB的評估結(jié)果數(shù)據(jù)只存在內(nèi)存中(重啟之后就會丟失),在會話之間是不可共用的,并且由于在Oracle11g中存在過多的Bug,常見的問題就是在第二次執(zhí)行SQL時候性能下降很多。因此在Oracle11g的數(shù)據(jù)庫中往往會對11.2.0.4以下的數(shù)據(jù)庫將該特性關(guān)閉。[考點(diǎn)]統(tǒng)計(jì)信息

14.

如何查詢表和索引的歷史統(tǒng)計(jì)信息?正確答案:從Oracle10g開始,當(dāng)收集表的統(tǒng)計(jì)信息的時候,舊的統(tǒng)計(jì)數(shù)據(jù)被保留,如果因?yàn)樾碌慕y(tǒng)計(jì)信息而出現(xiàn)性能問題,舊的統(tǒng)計(jì)信息就可以被恢復(fù)。歷史統(tǒng)計(jì)信息保存在以下幾張表中:

1)WRI$_OPTSTAT_TAB_HISTORY表的統(tǒng)計(jì)信息。

2)WRI$_OPTSTAT_IND_HISTORY索引的統(tǒng)計(jì)信息。

3)WRI$_OPTSTAT_HISTHEAD_HISTORY列的統(tǒng)計(jì)信息。

4)WRI$_OPTSTAT_HISTGRM_HISTORY直方圖的信息。

從視圖DBA_TAB_STATS_HISTORY可以查詢歷史收集統(tǒng)計(jì)信息的時間,但是不能查詢到行數(shù),所以需要結(jié)合基表來查詢,查詢的SQL語句如下:

SELECTB.OWNER,B,OBJECT_NAMETABLE_NAME,TO_CHAR(D.ANALYZETIME,'YYYY-MM-DDHH24:MI:SS')LAST_ANALYZETIME,

TO_CHAR(D.SAVTIME,'YYYY-MM-DDHH24:MI:SS')CURR_ANALYZETIME,D.ROWCNT

FROMSYS.WRI$_OPTSTAT_TAB_HISTORYD,DBA_OBJECTSB

WHERE

D.OBJ#=B.OBJECT_IDANDB.OBJECTNAMEIN('TEST_STAT','TPCCBOKBAL_TMP','TPCCBOKBALJN','PK_TPCCBOKBAL')

ORDERBYD.OBJ#,D.SAVTIME;

查詢索引的歷史統(tǒng)計(jì)信息的SQL語句如下:

SELECTB.OWNER,B.OBJECT_NAMEINDEX_NAME,TO_CHAR(D.ANALYZETIME,'YYYY-MM-DDHH24:MI:SS')LAST_ANALYZEIIME,

TO_CHAR(D.SAVTIME,'YYYY-MM-DDHH24:MI:SS')CURR_ANALYZETIME,D.ROWCNT,D.BLEVEL,D.LEAFCNT,D.DISTKEY,D.CLUFAC

FROMSYS.WRIS_OPTSTAT_IND_HISTORYD,DBA_OBJECTSB

WHERED.OBJ#=B.OBJECT_IDANDB.OBJECT_NAMEIN('IND_TEST)

ORDERBYD.OBJ#,D.SAVTIME;

默認(rèn)情況下統(tǒng)計(jì)信息將被保留31天,可以使用下面的命令修改:

EXECUTEDBMS_STATS.ALTER_STATSHISTORY_RETENTION(XX);

--xx是保留的天數(shù)

注意:這些統(tǒng)計(jì)信息在SYSAUX表空間中占有額外的存儲開銷,所以應(yīng)該注意并防止統(tǒng)計(jì)信息將表空間填滿。

SELECTDBMS_STATS.GET_STATS_HISTORY_RETENTIONFROMDUAL;--查詢統(tǒng)計(jì)信息當(dāng)前保留的天數(shù)。[考點(diǎn)]統(tǒng)計(jì)信息

15.

Oracle如何并發(fā)地收集統(tǒng)計(jì)信息?正確答案:對于大表的統(tǒng)計(jì)信息收集可以通過DEGREE參數(shù)使得掃描大表的時候進(jìn)行并行掃描,從而加快掃描速度,縮短了收集統(tǒng)計(jì)信息的時間。但是,即使加了DEGREE參數(shù),在收集統(tǒng)計(jì)信息的時候,還是進(jìn)行一個表一個表地掃描,并沒有并發(fā)地同時掃描多個表。在Oracle11.2.0.2之后,有了一個參數(shù),可以并發(fā)掃描表,這就是CONCURRENT參數(shù)??梢酝ㄟ^以下SQL語句查詢數(shù)據(jù)庫是否啟用了CONCURRENT收集統(tǒng)計(jì)信息,默認(rèn)為FALSE,表示沒有開啟并發(fā)收集統(tǒng)計(jì)信息:

SELECTDBMS_STATS.GET_PREFS('CONCURRENT')FROMDUAL;

開啟方式為

EXECDBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT','TRUE');

開啟CONCURRENT之后,收集統(tǒng)計(jì)信息就會以并發(fā)的形式進(jìn)行,會并發(fā)出多個JOB進(jìn)程。在并發(fā)收集統(tǒng)計(jì)信息時,數(shù)據(jù)庫生成的JOB數(shù)會根據(jù)具體情況來分配。在大多數(shù)情況下,DBMS_STATS程序會給每個對象分配一個JOB;但如果對象(表或者分區(qū))的大小太小,為了節(jié)省資源,Oracle會合并多個表和分區(qū)在一個JOB中執(zhí)行。為了防止同時處理多個分區(qū)表的分區(qū)時發(fā)生死鎖,對于分區(qū)表的處理機(jī)制是每次只能處理一個分區(qū)表,其他的分區(qū)表需要等待,待前一個分區(qū)表處理完后再處理下一個。在Oracle11.2.0.2到11.2.0.4的版本上,CONCURRENT可取的值為TRUE(開啟并發(fā))和FALSE(關(guān)閉并發(fā))。在Oracle12c的版本上,可以設(shè)置以下的值:

MANUAL:只有當(dāng)手動收集時,并發(fā)有效

AUTOMATIC:只有當(dāng)自動收集時,并發(fā)有效

ALL:手動/自動收集,并發(fā)都有效

OFF:并發(fā)無效

可以通過以下的視圖,對并發(fā)統(tǒng)計(jì)信息收集進(jìn)行監(jiān)視:

DBA_OPTSTAT_OPERATION_TASKS:當(dāng)前和歷史的統(tǒng)計(jì)信息收集的執(zhí)行任務(wù)

DBA_OPTSTAT_OPERATIONS:當(dāng)前和歷史的統(tǒng)計(jì)信息收集的執(zhí)行操作

DBA_SCHEDULER_JOBS:SCHEDULERJOBS信息

監(jiān)控并發(fā)收集統(tǒng)計(jì)信息JOB的SQL代碼如下:

SELECTJOB_NAME,STATE,COMMENTSFROMDBA_SCHEDULER_JOBSWHEREJOB_CLASSLIKE'CONC%';

SELECTSTATE,COUNT(*)FROMDBA_SCHEDULER_JOBSWHEREJOB_CLASSLIKE'CONC%'GROUPBYSTATE;

對于并發(fā)收集統(tǒng)計(jì)信息需要注意如下幾點(diǎn):

1)用CONCURRENT收集統(tǒng)計(jì)信息,需要收集統(tǒng)計(jì)信息的用戶具有CREATEJOB、MANAGESCHEDULER和MANAGEANYQUEUE權(quán)限。即使是該用戶具有了DBA角色,也還是需要顯式授權(quán)上述權(quán)限;否則執(zhí)行JOB的時候,可能會報(bào)錯:“ORA-27486insufficientprivileges”“ORA-20000:Statisticscollectionfailedfor32235objectsinthedatabase”。

2)因?yàn)镃ONCURRENT不能控制并發(fā)度的大小,所以,如果數(shù)據(jù)庫的初始化參數(shù)JOB_OUEUEPROCESSES設(shè)置得太高(在Oracle11.2.0.3之后,這個值的默認(rèn)值是1000,所以就可能并發(fā)出1000個JOB),那么對數(shù)據(jù)庫的性能影響較大。所以開啟CONCURRENT的另外一個建議就是使用ResourceManager來控制資源的使用。

3)下表列出了并發(fā)和并行在收集統(tǒng)計(jì)信息方面的一些區(qū)別。

[考點(diǎn)]統(tǒng)計(jì)信息

16.

當(dāng)收集表的統(tǒng)計(jì)信息時應(yīng)該注意哪些問題?正確答案:關(guān)于收集統(tǒng)計(jì)信息需要注意以下幾點(diǎn):

1)對于數(shù)據(jù)量不大的OLTP類型的系統(tǒng),建議使用自動收集統(tǒng)計(jì)信息,并對一些特殊的大表寫JOB定時收集統(tǒng)計(jì)信息。如果是數(shù)據(jù)量很大的OLAP或者DSS系統(tǒng),那么建議DBA自己寫JOB腳本來收集統(tǒng)計(jì)信息。

2)在導(dǎo)入大量數(shù)據(jù)后應(yīng)及時收集統(tǒng)計(jì)信息,才能進(jìn)行相關(guān)的后續(xù)業(yè)務(wù)處理(包括查詢和修改),否則可能會由于實(shí)際數(shù)據(jù)量和統(tǒng)計(jì)信息里記錄的數(shù)據(jù)量存在巨大差異而導(dǎo)致CBO選擇錯誤的執(zhí)行計(jì)劃。

3)全局臨時表默認(rèn)不能收集統(tǒng)計(jì)信息,在生成執(zhí)行計(jì)劃時采用動態(tài)采樣比較好。

4)對于某些新上線或新遷移的系統(tǒng),建議進(jìn)行全庫收集一次統(tǒng)計(jì)信息。

5)建議及時對包含日期型字段的表收集統(tǒng)計(jì)信息,避免出現(xiàn)謂詞越界現(xiàn)象。

6)統(tǒng)計(jì)信息收集作業(yè)采樣比例。對于Oracle11g及其以上的版本收集統(tǒng)計(jì)信息的采樣比例建議采用DBMS_STATS.AUTO_SAMPLESIZE。如果是Oracle10g,那么建議將采樣比例的初始值設(shè)為30%,然后根據(jù)目標(biāo)SQL的實(shí)際執(zhí)行情況再做調(diào)整。

7)系統(tǒng)統(tǒng)計(jì)信息。如果系統(tǒng)的硬件環(huán)境發(fā)生了變化,那么建議要額外收集一次系統(tǒng)統(tǒng)計(jì)信息。

8)內(nèi)部對象統(tǒng)計(jì)信息。在明確診斷出系統(tǒng)已有的性能問題是因?yàn)閄$表的內(nèi)部對象統(tǒng)計(jì)信息不準(zhǔn)確引起的,這個時候就應(yīng)該收集X$表的內(nèi)部對象統(tǒng)計(jì)信息,其他情形就不要收集了。

9)表的大小、是否并行。若表很大,而系統(tǒng)空閑,則可以使用并行來收集統(tǒng)計(jì)信息。

10)表是否分區(qū)。若是分區(qū)表則建議收集全局的統(tǒng)計(jì)信息并且收集數(shù)據(jù)量有變更的單個分區(qū)(加GRANULARITY和參數(shù)并設(shè)置屬性INCREMENTAL)的統(tǒng)計(jì)信息。

11)是否收集索引的統(tǒng)計(jì)信息。一般情況下都應(yīng)該收集索引的統(tǒng)計(jì)信息。

12)是否收集直方圖。對直方圖統(tǒng)計(jì)信息的收集策略是對已經(jīng)存在直方圖統(tǒng)計(jì)信息的列才收集直方圖統(tǒng)計(jì)信息,而目標(biāo)列的初次直方圖統(tǒng)計(jì)信息則是由了解系統(tǒng)的DBA手工來收集直方圖。設(shè)置METHOD_OPT的值為“FORALLCOLUMNSSIZEREPEAT”。

13)是否可以并發(fā)收集統(tǒng)計(jì)信息。若系統(tǒng)有很多小表,則可以考慮并發(fā)收集統(tǒng)計(jì)信息。

14)系統(tǒng)的負(fù)載情況。在手動收集統(tǒng)計(jì)信息的時候需要注意系統(tǒng)的負(fù)載情況。

15)預(yù)估多久可以收集完成。對OLAP系統(tǒng)的大表而言,根據(jù)平時收集統(tǒng)計(jì)信息的經(jīng)驗(yàn)要預(yù)估出收集統(tǒng)計(jì)信息要花費(fèi)多長的時間。

16)基于數(shù)據(jù)庫、SCHEMA或者表級別:根據(jù)情況判斷是否有必要在數(shù)據(jù)庫或SCHEMA級別來收集統(tǒng)計(jì)信息。

17)是否需要收集擴(kuò)展列的統(tǒng)計(jì)信息。如果表中的數(shù)據(jù)傾斜度較大,那么收集直方圖能最大限度地幫助優(yōu)化器計(jì)算出準(zhǔn)確的Cardinality,從而避免產(chǎn)生差的執(zhí)行計(jì)劃;再進(jìn)一步,如果存在傾斜的多個列共同構(gòu)成了Predicate里的等值連接且這些列間存在較強(qiáng)的列相關(guān)性,那么生成帶有直方圖的多列統(tǒng)計(jì)信息是一個上佳的選擇,能夠最大限度地幫助優(yōu)化器準(zhǔn)確預(yù)測出Cardinality。

18)是否設(shè)置NO_INVALIDATE為FALSE。該選項(xiàng)有TRUE、FALSE和DBMS_STATS.AUTO_INVALIDATE這3個值。如果取值為TRUE,那么表示收集統(tǒng)計(jì)信息后不進(jìn)行游標(biāo)失效動作,原有的SharedCursor保持原有狀態(tài):如果取值為FALSE,那么表示將統(tǒng)計(jì)信息對象相關(guān)的所有Cursor全部失效;如果設(shè)置為AUTO_INVALIDATE,那么Oracle自己決定SharledCursor失效動作,當(dāng)SQL再次執(zhí)行時間距離上次收集統(tǒng)計(jì)信息的時間超過5小時(隱含參數(shù)“_OPTIMIZER_INVALIDATION_PERIOD”決定)則對SQL重新做硬解析。AUTO_INVALIDATE為默認(rèn)選項(xiàng)。有些DBA在收集統(tǒng)計(jì)信息時,沒有使用NO_INVALIDATE=>FALSE選項(xiàng),所以,即使收集了統(tǒng)計(jì)信息,執(zhí)行計(jì)劃也不會立即改變。

19)對于OLTP類型的數(shù)據(jù)庫,需要特別關(guān)注DML比較頻繁的以及數(shù)據(jù)加載比較大的表及分區(qū)表。

20)檢查是否有鄰近統(tǒng)計(jì)信息收集窗口的數(shù)據(jù)加載工作,如果有,是否能在數(shù)據(jù)庫統(tǒng)計(jì)信息的窗口時間完成,如果不能在窗口時間完成,那么應(yīng)該針對這段時間加載的數(shù)據(jù),特別是大量的數(shù)據(jù),在相關(guān)加載腳本完成之后,加入統(tǒng)計(jì)信息的收集。

21)如果加載數(shù)據(jù)量比較大,并且是分區(qū)表,每個分區(qū)的業(yè)務(wù)數(shù)據(jù)呈現(xiàn)的是均勻的,在Oracle11g可以考慮采用DBMS_STATS.COPY_TABLE_STATS先把統(tǒng)計(jì)信息做個快速的設(shè)置,然后,再收集該分區(qū)的統(tǒng)計(jì)信息。

其實(shí),上述幾點(diǎn)是沒有一個普適性的標(biāo)準(zhǔn)答案的,因?yàn)椴煌南到y(tǒng)其數(shù)據(jù)量、數(shù)據(jù)分布情況都不盡相同,甚至可能會有很大的區(qū)別,所以適合于某套系統(tǒng)的統(tǒng)計(jì)信息收集策略并不一定能適用于另外一套系統(tǒng)。收集統(tǒng)計(jì)信息總的原則就是量體裁衣,即要找到適合自己系統(tǒng)的統(tǒng)計(jì)信息收集策略,用盡量小的代價收集到能穩(wěn)定生成正確執(zhí)行計(jì)劃的統(tǒng)計(jì)信息即可,也就是說,收集到的統(tǒng)計(jì)信息不一定要特別準(zhǔn),只要具備代表性,能穩(wěn)定生成正確的執(zhí)行計(jì)劃就可以了。[考點(diǎn)]統(tǒng)計(jì)信息

17.

什么是基數(shù)(Cardinality)和可選擇率(Selectivity)?正確答案:基數(shù)(Cardinality)是Oracle預(yù)估的返回行數(shù),即對目標(biāo)SQL的某個具體執(zhí)行步驟的執(zhí)行結(jié)果所包含記錄數(shù)的估算值。如果是針對整個目標(biāo)SQL,那么此時的Cardinality就表示該SQL最終執(zhí)行結(jié)果所包含記錄數(shù)的估算值。例如,一張表T有1000行數(shù)據(jù),列COL1上沒有直方圖,沒有空值,并且不重復(fù)的值(DistinctValue)有500個。那么,在使用條件“WHERECOL1=<VALUE>”去訪問表的時候,優(yōu)化器會假設(shè)數(shù)據(jù)均勻分布,它估計(jì)出會有1000/500=2行被選出來,2就是這步操作的Cardinality。通常情況下,Cardinality越準(zhǔn)確,生成的執(zhí)行計(jì)劃就會越高效。

可選擇率(Selectivity)是指施加指定謂詞條件后返回結(jié)果集的記錄數(shù)占未施加任何謂詞條件的原始結(jié)果集的記錄數(shù)的比率??蛇x擇率的取值范圍顯然是0~1,它的值越小,就表明可選擇性越好。當(dāng)可選擇率為1時的可選擇性是最差的。CBO就是用可選擇率來估算對應(yīng)結(jié)果集的Cardinality的,可選擇率和Cardinality之間的關(guān)系如下:

cardinality=NUM_ROWS*selectivity

其中,NUM_ROWS表示表的總行數(shù)。

在Oracle數(shù)據(jù)庫中,Oracle會默認(rèn)SQL語句的WHERE條件中出現(xiàn)的各列彼此之間是獨(dú)立的,是沒有關(guān)聯(lián)關(guān)系的。所以,如果目標(biāo)SQL語句各列之間是以AND來組合的,那么該sQL語句整個WHERE條件的組合可選擇率就等于各個列各自施加查詢條件后可選擇率的乘積。在得到了SQL語句整個WHERE條件的組合可選擇率后,Oracle會用它來估算整個SQL語句返回結(jié)果集的Cardinality,估算的方法就是用目標(biāo)表的總記錄數(shù)(NUM_ROWS)乘以組合可選擇率。但Oracle默認(rèn)的各列之間是獨(dú)立的、沒有關(guān)聯(lián)關(guān)系的前提條件并不總是正確的,在實(shí)際的應(yīng)用中各列之間有關(guān)聯(lián)關(guān)系的情況并不罕見。在這種情況下如果還用上述計(jì)算方法來計(jì)算目標(biāo)SQL語句整個WHERE條件的組合可選擇率并用它來估算返回結(jié)果集的Cardinalty,那么估算結(jié)果可能會與實(shí)際結(jié)果有較大的偏差,進(jìn)而可能導(dǎo)致CBO選錯執(zhí)行計(jì)劃,所以O(shè)racle又引入了動態(tài)采樣和多列統(tǒng)計(jì)信息。[考點(diǎn)]統(tǒng)計(jì)信息

18.

ASM磁盤有幾種冗余方式?正確答案:ASM使用獨(dú)特的鏡像算法,它不鏡像磁盤而是鏡像盤區(qū)。一個磁盤組可以由兩個或多個故障組(Failgroup)組成,一個故障組由一個或多個ASM磁盤組成。故障組提供了共享相同資源的冗余,ASM磁盤組有三種不同的冗余方式。

外部冗余(ExternalRedundancy)默認(rèn)冗余(NormalRedundancy)高度冗余(HighRedundancy)簡介表示Oracle不提供鏡像,鏡像功能由外部存儲系統(tǒng)實(shí)現(xiàn),比如通過RAID技術(shù)。外部冗余的有效磁盤空間是所有磁盤設(shè)備空間之和。創(chuàng)建外部冗余的磁盤組最少需要1塊ASM磁盤。故障組不能與外部冗余類型的磁盤組一起使用也叫標(biāo)準(zhǔn)冗余或正常冗余,表示Oracle提供兩份鏡像(提供雙向鏡像)來保護(hù)數(shù)據(jù)。默認(rèn)冗余的有效磁盤空間是所有磁盤設(shè)備大小之和的1/2。創(chuàng)建默認(rèn)冗余的磁盤組最少需要兩塊ASM磁盤,兩個故障組。這也是使用最多的一種冗余模式表示Oracle提供3份鏡像(提供三向鏡像)來保護(hù)數(shù)據(jù),以提高性能和數(shù)據(jù)的安全。高度冗余的有效磁盤空間是所有磁盤設(shè)備大小之和的1/3。創(chuàng)建高度冗余的磁盤組則最少需要3塊ASM磁盤,3個故障組用于普通磁盤組時所需的ASM磁盤數(shù)量123用于OCR和VF時所需的ASM磁盤數(shù)量135

需要注意的是,一旦磁盤組被創(chuàng)建,就不可以改變它的冗余方式。若想改變磁盤組的冗余方式,則必須創(chuàng)建具有適當(dāng)冗余的另一個磁盤組,然后必須使用RMAN還原的方式或使用DBMS_FILE_TRANSFER將數(shù)據(jù)文件移動到這個新創(chuàng)建的磁盤組。[考點(diǎn)]RAC

19.

與ASM相關(guān)的有哪些進(jìn)程?正確答案:AsM實(shí)例除了傳統(tǒng)的DBWn、LGWR、CKPT、SMON和PMON等進(jìn)程,還包含如下幾個新后臺進(jìn)程:進(jìn)程表現(xiàn)形式簡介RBAL(ASMRebalanceMasterProcess,ASM再平衡主進(jìn)程)asm_rbal+ASMora_rbal_ora11g用于協(xié)調(diào)和管理磁盤組之間的動態(tài)平衡,RBAL用來進(jìn)行全局調(diào)用,以打開某個磁盤組內(nèi)的磁盤ASMB(ASMBackgroundProcess,ASM后臺進(jìn)程)ora_asmb_ora11goracle+ASM_asmb_ora11g(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))借助服務(wù)器進(jìn)程建立普通RDBMS實(shí)例到ASM實(shí)例的會話,并傳遞磁盤文件的相關(guān)信息。每個數(shù)據(jù)庫實(shí)例同時只能與一個ASM實(shí)例連接,因此數(shù)據(jù)庫只會有一個ASMB舌臺進(jìn)程。如一個節(jié)點(diǎn)上有多個數(shù)據(jù)庫實(shí)例,它們只能共享一個ASM實(shí)例。ASMB進(jìn)程與該節(jié)點(diǎn)的CSS守護(hù)進(jìn)程進(jìn)行通信,并接收來自ASM實(shí)例的文件區(qū)間映射信息。ASMB還負(fù)責(zé)為ASM實(shí)例提供I/O統(tǒng)計(jì)數(shù)據(jù)GMON(ASMDiskGroupMonitorProcess,磁盤組監(jiān)控進(jìn)程)asm_gmon_+ASM這個進(jìn)程負(fù)責(zé)維護(hù)磁盤組中的各個磁盤狀態(tài)的一致性。當(dāng)磁盤組中的磁盤成員發(fā)生改變時(例如,添加、刪除磁盤,或者磁盤出現(xiàn)故障),該進(jìn)程負(fù)責(zé)離線(Offline)或者上線(Online)磁盤??梢哉f,這是ASM實(shí)例中最重要的后臺進(jìn)程之一ARBn(ASMRebalanoeProcess,ASM再平衡進(jìn)程)asm_arba_+ASM在同一時刻可以存在許多此類進(jìn)程,它們的名字分別為ARB0、ARB1、…、ARBA,以此類推,執(zhí)行實(shí)際的重新平衡分配單元移動進(jìn)程Onnn(ASMConnectionPoolProcess,ASM連接池進(jìn)程)ora_o000_ora11gOracle+ASM_o000_Ora11g(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))這組進(jìn)程建立了與ASM實(shí)例的連接,某些長時間操作比如創(chuàng)建數(shù)據(jù)文件操作,RDBMS會通過這些進(jìn)程向ASM發(fā)送信息[考點(diǎn)]RAC

20.

什么是RAC?RAC有哪些優(yōu)缺點(diǎn)?正確答案:RAC(RealApplicationClusters,實(shí)時應(yīng)用集群)是Oracle數(shù)據(jù)庫中采用的一項(xiàng)新技術(shù),是高可用性的一種,也是Oracle數(shù)據(jù)庫支持網(wǎng)格計(jì)算環(huán)境的核心技術(shù)。如何在一個7*24的系統(tǒng)上實(shí)現(xiàn)數(shù)據(jù)庫的高可用性呢?RAC就是最好的解決方案,RAC也成為高級DBA的必備技能之一。

從Oracle9i版本開始就支持RAC了,可以支持7*24有效的數(shù)據(jù)庫應(yīng)用系統(tǒng),在低成本服務(wù)器上構(gòu)建高可用性數(shù)據(jù)庫系統(tǒng),并且自由部署應(yīng)用,無須修改代碼。在Oracle9i之前,RAC稱為OPS(OracleParallelServer)。RAC與OPS之間的一個較大區(qū)別是,RAC采用了CacheFusion(緩存融合)技術(shù),節(jié)點(diǎn)已經(jīng)取出的數(shù)據(jù)塊更新后沒有寫入磁盤前,可以被另外一個節(jié)點(diǎn)更新,然后以最后的版本寫入磁盤;在OPS中,節(jié)點(diǎn)間的數(shù)據(jù)請求需要先將數(shù)據(jù)寫入磁盤,然后發(fā)出請求的節(jié)點(diǎn)才可以讀取該數(shù)據(jù)。使用CacheFusion時,RAC的各個節(jié)點(diǎn)間數(shù)據(jù)緩沖區(qū)通過高速、低延遲的內(nèi)部網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)塊的傳輸。在OracleRAC環(huán)境下,Oracle提供了集群軟件和存儲管理軟件,為用戶降低了應(yīng)用成本。當(dāng)應(yīng)用規(guī)模需要擴(kuò)充時,用戶可以按需擴(kuò)展系統(tǒng),以保證系統(tǒng)的性能。

(1)優(yōu)點(diǎn)

1)RAC是一種雙機(jī)并行模式,并非主備模式。也就是說,RAC集群的所有成員都可以同時接收客戶端的請求。所以,RAC實(shí)現(xiàn)了容錯、單點(diǎn)故障解決(如果有節(jié)點(diǎn)掛掉,那么其他節(jié)點(diǎn)可以繼續(xù)提供服務(wù))和多節(jié)點(diǎn)負(fù)載均衡(不同節(jié)點(diǎn)可以相互配合,分擔(dān)負(fù)載)。

2)提供高可用性、故障容錯和無縫切換功能,將硬件和軟件錯誤造成的影響最小化,能夠保證在集群中只要有一個節(jié)點(diǎn)存活,就能正常對外提供服務(wù)。

3)通過并行執(zhí)行技術(shù)提高事務(wù)響應(yīng)時間,通常被用于OLAP系統(tǒng)。

4)通過橫向擴(kuò)展提高每秒交易數(shù)和連接數(shù),通常被用于OLTP系統(tǒng)。

5)擴(kuò)展了機(jī)器的負(fù)載能力,節(jié)約了硬件成本,可以用多個廉價PC(PersonalComputer)服務(wù)器代替昂貴的小型機(jī)或大型機(jī),同時節(jié)約相應(yīng)維護(hù)成本。

6)易伸縮、可擴(kuò)展性好,可以方便添加、刪除節(jié)點(diǎn),擴(kuò)展硬件資源。

7)實(shí)現(xiàn)了業(yè)務(wù)分割處理。

8)低成本。能使用較低廉的服務(wù)器來實(shí)現(xiàn)高可用性、高吞吐量的集群環(huán)境,這要比通過對某臺高端服務(wù)器增加硬件實(shí)現(xiàn)高可用性、高吞吐量花費(fèi)的成本低很多。

9)高吞吐量。隨著節(jié)點(diǎn)數(shù)的增加,整個RAC的吞吐量也在不斷增長。

(2)缺點(diǎn)

1)相對單機(jī),由于底層技術(shù)復(fù)雜,所以,管理更復(fù)雜,對DBA的技術(shù)要求更高。

2)可能會增加軟件成本(如果使用高配置的PC服務(wù)器,那么Oracle一般按照CPU個數(shù)收費(fèi))。

3)在RAC系統(tǒng)規(guī)劃設(shè)計(jì)較差時性能可能會不如單節(jié)點(diǎn),存在資源爭用(CacheFusion)。

(3)RAC的特點(diǎn)如下:

1)每一個節(jié)點(diǎn)的實(shí)例都有自己的SGA。

2)每一個節(jié)點(diǎn)的實(shí)例都有自己的后臺進(jìn)程。

3)每一個節(jié)點(diǎn)的實(shí)例都有自己的聯(lián)機(jī)Redo日志文件。

4)每一個節(jié)點(diǎn)的實(shí)例都有自己的Undo表空間。

5)所有節(jié)點(diǎn)都共享一份DataFiles和ControlFiles。[考點(diǎn)]RAC

21.

用哪個參數(shù)可以判斷一個數(shù)據(jù)庫是否是RAC庫?正確答案:在SQL中查詢CLUSTER_DATABASE這個參數(shù)即可以看出當(dāng)前庫是否是RAC庫,示例如下:

CLUSTER_DATABASE的值為TRUE,代表當(dāng)前DB為RAC庫,參數(shù)CLUSTER_DATABASE_INSTANCES的值為2,代表是2個節(jié)點(diǎn)的RAC。[考點(diǎn)]RAC

22.

啟動和關(guān)閉集群的命令是什么?正確答案:關(guān)閉集群命令:crsctlstopcluster-all。

啟動集群命令:crscflstartcluster-all。

高可用性進(jìn)程查看命令:ps-ef|grepd.bin,該命令輸出結(jié)果如下:

[ZHLHRDB01:root]/]>ps-ef|grepd.bin

root12910838

13116:12:12

-0:00/u01/app/11.2.O/grid/bin/ologgerd-mzlhrcb2101-r-d/u01/app/11.2.0/grid/crf/db/zlhrcb1101

root6553890

1

616:11:35

-0:01/u01/app/11.2.0/grid/bin/ohasd.binreboot

grid6684956

1

516:12:03

-0:00/u01/app/11.2.0/grid/bin/gipcd.bin

root6750494

1

816:12:03

-0:00/u01/app/11.2.0/grid/bin/osysmond.bin

root6816030

1

016:12:05

-0:00/bin/sh/u01/app/11.2.0/grid/bin/ocssd

root3342930

1

016:12:05

-0:00/u01/app/11.2.0/grid/bin/cssdagent

root340844868160301116:12:05

-0:00/u01/app/11.2.0/grid/bin/ocssd.bin

root3670608

1

016:12:03

-0:00/u01/app/11.2.0/grid/bin/orarootagent.bin

grid3736148

1

016:11:59

-0:00/u01/app/11.2.0/grid/bin/mdnsd.bin

grid8061810

1

016:11:59

-0:00/u01/app/11.2.0/grid/bin/oraagent.bin

root8127338

1

016:12:04

-0:00/u01/app/11.2.0/grid/bin/cssdmonitor

rood8192874

1

616:12:01

-0:00/u01/app/11.2.0/grid/bin/gpnpd.bin[考點(diǎn)]RAC

23.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論