1定位消耗資源的sql,可以檢視v$sqlstats視圖
The most common resources are:
Buffer gets (<code>V$SQLSTATS</code>.<code>BUFFER_GETS</code>, for high CPU using statements)
Disk reads (<code>V$SQLSTATS</code>.<code>DISK_READS</code>, for high I/O statements)
Sorts (<code>V$SQLSTATS</code>.<code>SORTS</code>, for many sorts)
一般來說,如果選擇性強的謂詞在子查詢使用in,如果選擇性強的謂詞在父查詢使用exists
複雜視圖的連接配接是不被推薦的,尤其是2個複雜視圖的關聯,通常的結果是整個視圖執行個體化。
減少通路表的次數
使用case語句來連接配接多次的掃描
使用帶retruing的dml
在一個語句中修改所有需要的資料
例子
However, it is more efficient to run the entire query in a single statement. Each number is calculated as one column. The count uses a filter with the<code>CASE</code> statement to count only the rows where the condition is valid. For example:
視圖合并
在查詢中的每一個視圖被分析器展開成一個獨立的查詢塊,查詢塊本質代表着視圖定義,也是視圖的結果。優化器的一個選項是分開分析視圖查詢塊并産生視圖子計劃。優化器使用視圖子定義生成整體的查詢計劃。這種技術通常導緻次優的查詢計劃,因為視圖與其餘的查詢分離開被優化。
查詢轉換器通過合并查詢塊到包含視圖的查詢塊中來移除潛在的次優計劃,産生子計劃已經不再被需要了,因為視圖查詢塊被消除了。
謂詞推進
對這些沒有被合并的視圖,查詢轉換器可以推相關的謂詞到包含視圖查詢塊中,這個技術提高了沒有合并視圖的子計劃,因為推入的謂詞可以通路索引或是作為過濾器。
子查詢展開
通常包含子查詢的查詢通過展開子查詢,把他們轉換成連接配接能提高性能,大多數的子查詢會被查詢轉換期展開。對那些沒有展開的子查詢,獨立的子查詢被生成,為了提升整個查詢計劃的速度,子計劃以有效的方式排序。
使用物化視圖重寫查詢
物化視圖是查詢結果的物化存儲在表中,當使用者的查詢和物化視圖相比對的時候,使用者的查詢可以被重寫,這種技術提高使用者的查詢,因為大部分的查詢結果已經被提前計算了,優化器查找物化視圖,選擇一個或多個物化視圖來重寫使用者查詢,這個是cbo的,也就是重寫的cost高就不重寫了,除非重寫後的cost比較低。
評估器
評估器生成3個度量
selectivity,cardinality,cost
選擇性
選擇性綁定到一個查詢謂語,謂語是過濾器,在行集合中過濾出特定的行。選擇性的範圍是0.0到1.0.如果沒有統計資訊,那麼優化器或是使用動态采樣或是内部預設的值,依賴與optimizer_dynamic_sampling的初始參數值。不同的預設值被使用,依賴與不同的謂詞類型。
表連接配接的幾個方法:
Nested Loop Joins
Hash Joins
Sort Merge Joins
Cartesian Joins
Outer Joins
優化器怎麼為join選擇執行計劃
優化器考慮下面的來生成執行計劃
1優化器先看是否有2個或更多的表連接配接會生成包含1行的行源,如果有優化器就先連接配接這些表,然後在連接配接剩餘的表。
2對包含外連接配接的條件,外連接配接的操作一定在别的表連接配接後面出現,優化器不考慮違法這個條件的連接配接順序。例如,當子查詢轉換成反連接配接或半連接配接,子查詢的表一定出現在外部查詢表的後面。hash反連接配接和半連接配接在一定的條件下會覆寫這個順序。
oracle什麼時候使用nested loop 連接配接
優化器當在連接配接小的行,在2個表上有好的驅動條件的時候使用netsted loop.内連接配接上最好使用索引。
hash join
對于大表連接配接有用,優化器會把較小的表在記憶體中建構一個hash table,然後掃描大表,探測hash表來找連接配接的行。
sort merge
對連接配接2個獨立的行源,hash join通常要比sort merge好,如果下面的條件滿足,sort merge要比hash join好:
1行源已經是排過序的。
2排序操作不必做。
sort merge在兩個表是不等的條件下,sort merge在大資料量下比nest loop好,在不等條件下,不能使用hash join
In Example 13-9, the outer join is to a multitable view. The optimizer cannot drive into the view like in a normal join or push the predicates, so it builds the entire row set of the view.
Example 13-9 Outer Join to a Multitable View
The view definition is as follows:
統計資訊包含下面的東西
Table statistics
Number of rows
Number of blocks
Average row length
Column statistics
Number of distinct values (NDV) in column
Number of nulls in column
Data distribution (histogram)
Index statistics
Number of leaf blocks
Levels
Clustering factor
System statistics
I/O performance and utilization
CPU performance and utilization
優化器的統計資訊自動的使用gather_stats_job來收集,這個job收集下面的資訊:
丢失的資訊
無效的資訊
這個job是自動建立的,并使用scheduler來管理,gather_stats_job調用dbms_stats.gather_database_stats_job_proc存儲過程,這個存儲過程收集丢失的資訊,和無效的資訊(就是那些資料10%以上被修改的)。
啟用自動收集
1select * from dba_scheduler_jobs where job_name='GATHER_STATS_JOB';
禁用自動收集
什麼時候手工收集資訊
1在statistics_level是basic的時候,自動統計收集不能檢測無效統計資訊,需要手工收集
2系統的統計資料,需要手工收集,動态性能視圖的統計資訊應該使用gather_fixed_objects_stats來收集
使用dbms_stats的存儲過程收集統計資訊的時候,需要注意的地方:
Statistics Gathering Using Sampling
Parallel Statistics Gathering
Statistics on Partitioned Objects
Column Statistics and Histograms
Determining Stale Statistics
User-defined Statistics
使用sampleing采樣
并行收集資訊
oracle建議并行收集的degree參數設定成<code>DBMS_STATS.AUTO_DEGREE,根據對象的大小和并行參數的設定,自動的來決定并行度。</code>
<code>決定無效的統計資訊</code>
<code>為了決定對象是否需要新的統計資訊,oracle提供了一個工具,user_tab_modifications視圖,這個視圖反映該表的dml操作,oracle需要幾分鐘來同步這個視圖,可以使用dbms_stats.flush_database_monitoring_info存儲過程來馬上檢視記憶體中的資訊。</code>
<code>gather_database_stats或gather_schema_stats存儲過程的options參數被設定成gather stale或ather auto會自動收集無效的統計資訊,表超過了10%的資料被修改了,就認為該表上的統計資訊是無效的了。</code>
<code>動态采樣是怎麼工作的</code>
<code>主要的性能屬性是編譯時間,oracle在編譯時候決定一個查詢是否能從動态采樣中受益,如果可以,那麼一些sql掃描一小部分随機的樣例資料,應用到相應的表上來評估謂詞選擇性。</code>
<code>當沒有統計資訊也沒有動态采樣的時候</code>
<code></code>
Table 14-3 Default Table Values When Statistics Are Missing
Table Statistic
Default Value Used by Optimizer
<code>Cardinality</code>
num_of_blocks * (block_size - cache_layer) / avg_row_len
<code>Average row length</code>
100 bytes
<code>Number of blocks</code>
100 or actual value based on the extent map
<code>Remote cardinality</code>
2000 rows
<code>Remote average row length</code>
Table 14-4 Default Index Values When Statistics Are Missing
Index Statistic
<code>Levels</code>
1
<code>Leaf blocks</code>
25
<code>Leaf blocks/key</code>
<code>Data blocks/key</code>
<code>Distinct keys</code>
100
<code>Clustering factor</code>
800
<code>檢視直方圖</code>
在tab_col_statistics視圖中histogram列是直方圖,可以使height balanced frequency 或是none
等高直方圖
等高直方圖中,列值被分成幾個組,每個組大約有相同的行。假如一個列C的值是1到100,如果c是唯一值分布的,那麼就如下面的圖:

在每一個桶中的行數是總量的10分之1。
如果資料不是唯一值分布的,那麼直方圖可以使下面的這樣
這種情況下,列中很多的行是5,60到100之間的行占總行的1/10.
Example 14-1 Viewing Height-Balanced Histogram Statistics