Oracle的自動(dòng)分析是Oracle數(shù)據(jù)庫(kù)的一個(gè)非常重要的功能,它可以自動(dòng)地收集、分析并存儲(chǔ)關(guān)于數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息,以便于優(yōu)化數(shù)據(jù)庫(kù)的性能。下面將詳細(xì)介紹如何使用analyze命令來(lái)實(shí)現(xiàn)自動(dòng)分析。
Oracle數(shù)據(jù)庫(kù)中的每個(gè)表和索引都有一組統(tǒng)計(jì)信息,包括行數(shù)、塊數(shù)、平均行長(zhǎng)度、空塊數(shù)等等。這些信息在Oracle數(shù)據(jù)庫(kù)優(yōu)化器中用于選擇最佳執(zhí)行計(jì)劃,以提高查詢的執(zhí)行效率。通常,我們需要手動(dòng)收集這些統(tǒng)計(jì)信息,但是如果我們開啟了Oracle自動(dòng)分析,數(shù)據(jù)庫(kù)將會(huì)在后臺(tái)自動(dòng)地收集和更新這些信息。
alter session set "_optimizer_autostats_on_sampling"=true;
首先,我們需要開啟Oracle自動(dòng)分析的開關(guān)。在Oracle 11g及以上版本中,默認(rèn)情況下該功能是開啟的,但有時(shí)候需要手動(dòng)開啟。在SQLPLUS終端中,我們可以使用以上命令來(lái)開啟自動(dòng)分析。
Oracle自動(dòng)分析功能可以通過(guò)以下方法來(lái)收集統(tǒng)計(jì)信息:
1. 自動(dòng)收集對(duì)于DDL操作而言是及時(shí)的
即,對(duì)于新建的、修改的、變更的、刪除的表、索引和列,在用戶提交DDL操作之后,數(shù)據(jù)庫(kù)會(huì)自動(dòng)地收集該對(duì)象的統(tǒng)計(jì)信息。例如,我們修改了一張表,設(shè)置了一個(gè)新的索引,則該新的索引第一次被使用時(shí),數(shù)據(jù)庫(kù)會(huì)自動(dòng)地為該索引收集統(tǒng)計(jì)信息。
2. 自動(dòng)收集對(duì)于DML操作而言是在合適的時(shí)間點(diǎn)的
即,當(dāng)一個(gè)表或索引發(fā)生一定量的數(shù)據(jù)變動(dòng)時(shí),數(shù)據(jù)庫(kù)會(huì)自動(dòng)收集該對(duì)象的統(tǒng)計(jì)信息。這里的“一定量”是一個(gè)可設(shè)置的閾值,通常是行數(shù)或塊數(shù)。當(dāng)一個(gè)表或索引的數(shù)據(jù)發(fā)生較大變動(dòng)時(shí),自動(dòng)收集統(tǒng)計(jì)信息可以提高查詢的執(zhí)行效率。例如,我們使用insert語(yǔ)句向表中插入了一批數(shù)據(jù),則在該表中累計(jì)插入了可設(shè)置閾值之后,數(shù)據(jù)庫(kù)會(huì)自動(dòng)地為該表收集統(tǒng)計(jì)信息。
3. 自動(dòng)收集部分全局級(jí)別的統(tǒng)計(jì)信息
即,對(duì)于全局級(jí)別的信息,如全局塊使用率、全局空間使用率等等,數(shù)據(jù)庫(kù)會(huì)在固定的時(shí)間間隔內(nèi)自動(dòng)收集并更新該類的統(tǒng)計(jì)信息。
Oracle自動(dòng)分析可以在大部分情況下自動(dòng)地滿足我們的需求,極大地提高了數(shù)據(jù)庫(kù)運(yùn)維的效率。但在一些特定的情況下,可能需要手動(dòng)地收集統(tǒng)計(jì)信息來(lái)保證查詢的執(zhí)行效率。
analyze table tablename compute statistics;
analyze index indexname compute statistics;
對(duì)于需要手動(dòng)收集統(tǒng)計(jì)信息的情況,我們可以使用以上命令來(lái)收集該對(duì)象的統(tǒng)計(jì)信息。analyze命令將會(huì)消耗較大的CPU和I/O資源,因此,我們需要謹(jǐn)慎選擇需要手動(dòng)收集統(tǒng)計(jì)信息的對(duì)象。