新聞中心
Oracle 12c新特性探索:多列統(tǒng)計(jì)信息的檢測(cè)與應(yīng)用詳解

技術(shù)內(nèi)容:
在Oracle數(shù)據(jù)庫(kù)中,統(tǒng)計(jì)信息對(duì)于優(yōu)化器來(lái)說(shuō)至關(guān)重要,優(yōu)化器根據(jù)統(tǒng)計(jì)信息來(lái)選擇最佳的執(zhí)行計(jì)劃,從而提高查詢(xún)性能,在Oracle 12c之前,數(shù)據(jù)庫(kù)只能收集單列的統(tǒng)計(jì)信息,而在Oracle 12c中,引入了多列統(tǒng)計(jì)信息(Multicolunm Statistics)的新特性,這使得優(yōu)化器能夠更加準(zhǔn)確地估計(jì)多列之間的相關(guān)性,進(jìn)而提高查詢(xún)性能,本文將詳細(xì)介紹如何檢測(cè)有用的多列統(tǒng)計(jì)信息及其在查詢(xún)優(yōu)化中的應(yīng)用。
多列統(tǒng)計(jì)信息簡(jiǎn)介
1、什么是多列統(tǒng)計(jì)信息?
多列統(tǒng)計(jì)信息是指同時(shí)收集兩列或多列之間的相關(guān)性統(tǒng)計(jì)信息,這有助于優(yōu)化器在處理多列條件查詢(xún)時(shí),更準(zhǔn)確地估計(jì)行數(shù),從而選擇更優(yōu)的執(zhí)行計(jì)劃。
2、多列統(tǒng)計(jì)信息的類(lèi)型
在Oracle 12c中,支持以下兩種類(lèi)型的多列統(tǒng)計(jì)信息:
(1)單表多列統(tǒng)計(jì)信息:針對(duì)單個(gè)表的兩列或多列收集統(tǒng)計(jì)信息。
(2)多表多列統(tǒng)計(jì)信息:針對(duì)多個(gè)表的兩列或多列收集統(tǒng)計(jì)信息。
3、多列統(tǒng)計(jì)信息的收集方法
可以使用DBMS_STATS包中的以下過(guò)程來(lái)收集多列統(tǒng)計(jì)信息:
(1)GATHER_TABLE_STATS:收集單表的多列統(tǒng)計(jì)信息。
(2)GATHER_SCHEMA_STATS:收集指定模式下的多表多列統(tǒng)計(jì)信息。
(3)GATHER_DATABASE_STATS:收集整個(gè)數(shù)據(jù)庫(kù)的多表多列統(tǒng)計(jì)信息。
如何檢測(cè)有用的多列統(tǒng)計(jì)信息
在實(shí)際應(yīng)用中,并非所有的多列統(tǒng)計(jì)信息都對(duì)優(yōu)化器有幫助,如何檢測(cè)哪些多列統(tǒng)計(jì)信息是有用的呢?以下方法可以幫助我們判斷:
1、使用SQL Access Advisor
SQL Access Advisor是一個(gè)基于成本的優(yōu)化工具,它可以分析SQL語(yǔ)句并推薦最優(yōu)的執(zhí)行計(jì)劃,通過(guò)運(yùn)行SQL Access Advisor,可以檢測(cè)當(dāng)前的多列統(tǒng)計(jì)信息是否有助于生成最優(yōu)的執(zhí)行計(jì)劃。
2、比較不同統(tǒng)計(jì)信息下的執(zhí)行計(jì)劃
通過(guò)比較在收集多列統(tǒng)計(jì)信息前后,同一SQL語(yǔ)句的執(zhí)行計(jì)劃,可以判斷多列統(tǒng)計(jì)信息是否對(duì)優(yōu)化器有幫助。
3、檢查統(tǒng)計(jì)信息的基數(shù)估計(jì)
通過(guò)查詢(xún)數(shù)據(jù)字典視圖,如DBA_TAB_COL_STATISTICS,查看多列統(tǒng)計(jì)信息的基數(shù)估計(jì)是否與實(shí)際值接近,如果接近,說(shuō)明多列統(tǒng)計(jì)信息對(duì)優(yōu)化器有幫助。
多列統(tǒng)計(jì)信息在查詢(xún)優(yōu)化中的應(yīng)用
下面通過(guò)一個(gè)示例來(lái)演示多列統(tǒng)計(jì)信息在查詢(xún)優(yōu)化中的應(yīng)用。
1、創(chuàng)建測(cè)試表
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER, c3 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER, c3 NUMBER); INSERT INTO t1 SELECT LEVEL, MOD(LEVEL, 5), MOD(LEVEL, 10) FROM dual CONNECT BY LEVEL <= 10000; INSERT INTO t2 SELECT LEVEL, MOD(LEVEL, 5), MOD(LEVEL, 10) FROM dual CONNECT BY LEVEL <= 10000; COMMIT;
2、收集單表多列統(tǒng)計(jì)信息
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT',
tabname => 'T1',
method_opt => 'FOR COLUMNS (C1, C2, C3)',
cascade => TRUE
);
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT',
tabname => 'T2',
method_opt => 'FOR COLUMNS (C1, C2, C3)',
cascade => TRUE
);
END;
/
3、查看執(zhí)行計(jì)劃
在收集多列統(tǒng)計(jì)信息之前,執(zhí)行以下查詢(xún):
SELECT * FROM t1, t2 WHERE t1.c1 = t2.c1 AND t1.c2 = t2.c2 AND t1.c3 = t2.c3;
查看執(zhí)行計(jì)劃,發(fā)現(xiàn)優(yōu)化器選擇了嵌套循環(huán)連接(NESTED LOOPS)。
在收集多列統(tǒng)計(jì)信息之后,再次查看執(zhí)行計(jì)劃,發(fā)現(xiàn)優(yōu)化器選擇了哈希連接(HASH JOIN),并且執(zhí)行性能有所提高。
4、分析原因
通過(guò)查詢(xún)數(shù)據(jù)字典視圖DBA_TAB_COL_STATISTICS,發(fā)現(xiàn)多列統(tǒng)計(jì)信息使得優(yōu)化器能夠更準(zhǔn)確地估計(jì)連接條件(t1.c1 = t2.c1, t1.c2 = t2.c2, t1.c3 = t2.c3)的基數(shù),優(yōu)化器選擇了更合適的連接方法(哈希連接),從而提高了查詢(xún)性能。
Oracle 12c的多列統(tǒng)計(jì)信息特性使得優(yōu)化器能夠更準(zhǔn)確地估計(jì)多列之間的相關(guān)性,進(jìn)而選擇更優(yōu)的執(zhí)行計(jì)劃,在實(shí)際應(yīng)用中,我們可以通過(guò)SQL Access Advisor、比較執(zhí)行計(jì)劃、檢查統(tǒng)計(jì)信息的基數(shù)估計(jì)等方法來(lái)檢測(cè)有用的多列統(tǒng)計(jì)信息,通過(guò)合理利用多列統(tǒng)計(jì)信息,可以提高查詢(xún)性能,優(yōu)化數(shù)據(jù)庫(kù)的整體性能。
網(wǎng)頁(yè)標(biāo)題:Oracle12c新特性之如何檢測(cè)有用的多列統(tǒng)計(jì)信息詳解
網(wǎng)站URL:http://www.dlmjj.cn/article/djedped.html


咨詢(xún)
建站咨詢(xún)
