提高查詢性能01

--------------------索引改進性能的程度部分取決於數據的選擇性以及表的塊之間分佈數據的方式。
(1)選擇性是指oracle將能夠快速查詢匹配索引值的rowid的索引,並且可用快速查詢少量的相關表塊。
(2)數據分佈:
    I執行全表掃描時,oracle使用多塊讀取以快速掃描表
    II索引的讀取是單塊讀取,因此在使用索引時的目標時減少解決查詢所需的單個塊的數量。

---------------------判斷使用索引的價值
方法就是判斷索引中的唯一鍵或不同鍵的數量。
查詢user_index視圖的distinct_key列來研究分析結果。比較以下唯一鍵的數量和表中的行數。
(如user_index視圖的num_row列所示)就可以判斷索引的選擇性,選擇性越高,索引返回的行數就越少,該索引就越高。

--------------------兩種常見的索引掃描類型是:唯一掃描和範圍掃描

(1)在唯一掃描中,數據庫知道索引包含一個唯一值列表。在創建索引時,使用create unique index命令可以創建唯一索引。
  在創建主鍵或unique約束時,oracle將基於指定的值的列自動創建唯一索引。
(2)在範圍掃描中,數據庫將根據查詢標準從索引中返回多個值。
 快速全局掃描:查詢中的所有列都被包含在索引中,而索引中的第一列並不在where條件中。
在索引的快速全局掃描期間,oracle讀取B樹索引上的所有樹葉塊。這個索引可以按順序讀取。這樣就可用一次讀取多個塊。
初始化參數文件的DB_FILE_MULIBLOCK_READ_COUNT參數可以控制同時被讀取的塊的數目,相比全表掃描,快速全局掃描通常需要較少的物理I/O,並且允許更快速度地處理查詢。
索引跳躍式掃描比全局索引掃描塊得多,這是因爲它只需要執行很少量的讀取。
在引入跳躍式掃描之前,查詢只能在where子句中使用索引的第一列時使用索引。跳躍式掃描,組合索引的第一列不在where子句中,會使用跳躍式掃描索引。

------------------索引種類

可以在同一張表上創建位圖索引和B樹索引。oracle將在查詢處理期間動態執行必要的索引轉化。
1).B樹索引:最多包含32列
2).位圖索引:最多包含30列。例如:包含sex列,只有男和女。這個基數只爲2.如果用戶頻繁地根據sex列的值查詢該表,這就是位圖索引的基列。位圖索引適合決策支持系統(DDS)和數據倉庫。
          他們不應該用於通過事物處理應用程序訪問的表。 對於針對大型的具有非常少不同值的靜態數據集查詢,位圖索引最有效。
3).HASH索引:HASH索引必須使用HASH集羣建立集羣的同時也定義了集羣鍵,這個鍵告訴oracle如何在集羣中存儲表。在存儲數據時,所有與這個集羣相關的行都被存儲在一個數據快上。
          HASH索引可能是訪問數據庫中數據最快的方法,但它也有缺點,集羣鍵上不同值的數目必須在創建HASH集羣之前就要知道,需要在創建HASH集羣的時候指定這個值。
          如果頻繁地同時查詢兩個表,則使用集羣就是改進性能的有效方法。根據他們的集羣鍵,集羣在相同的物理數據中存儲來自多個表中的行。
          將列值與確切得值進行比較的查詢叫作“等價查詢”,散列集羣設計用於改進等價查詢性能,對範圍查詢的性能沒有任何幫助。
4).索引組織表:索引組織表會把表的存儲結構改爲B樹結構,以表的主鍵進行排序,由於表的特殊結構。rowid並沒有被關聯到表的行ID。
             對於總是通過對主鍵的精確匹配,或範圍掃描進行訪問的表。就需要考慮使用索引組織表。
           基於主鍵的update,delete語句的性能也同樣會提高,這是因爲行在物理上有序。由於鍵列的值在表和索引中沒有重複,存儲所需要的空間按也隨之減少。
5).反向鍵索引:當載入一些有序的數據時,索引肯定會碰到與I/O相關的一些瓶頸。在數據載入期間,某部分索引和磁盤肯定會比其他部分使用頻繁的多。
             爲了解決這個問題,有2種方式.
             I.可以把索引表空間存放在能夠把文件物理分割在多個磁盤上的磁盤體系結構上。
            II.oracle還提供了一種反向鍵索引的方法。不能對位圖索引和索引組織表進行反向鍵處理。
6).基於函數索引:任何在列上執行了函數的查詢都不能使用這個列的索引。必須基於成本優化器模式,而且設置以下參數,纔可以使用基於函數的索引。
              query_rewrite_enable=true;
              query_rewrite_integrity=trusted(or force)
7).分區索引:本地分區索引可用是B樹或位圖索引。每個本地索引的分區只包含了它所關聯的表分區的鍵的rowid。
          全局分區索引,只能是B樹索引,在創建全局分區索引時,必須定義分區鍵的範圍和值,全局分區索引在一個索引分區中包含來自多個表分區的鍵。
8).位圖連接索引:位圖連接索引是基於兩個表的連接的位圖索引。位圖連接索引允許您在兩張表的連接列間建立單一索引。
              一張表的rowid和另一張表一起存儲。在位圖連接索引中,表的rowid將和連接表的索引列一起保存。
               oracle中的位圖連接索引更像在兩張表間建立一個單一索引。必須爲其中一個表建立一個主鍵,或者唯一約束。
               
create bitmap index emp_dept_idx on emp1 (dept1.deptno) from emp1,dept1 where emp1.deptno=dept1.deptno.
位圖連接索引是包含一個連接條件的物化視圖的替換形式,存儲相關的rowid所需的存儲空間可能遠小於存儲視圖本身的結果所需的空間。
             限制:只有一個表可用由不同的事物處理併發地進行更新。在連接中任何表的出現都不能多於一次。不能在一個IOT或臨時表上創建位圖連接索引。
                  不能使用unique屬性來創建位圖連接索引。用於索引的連接列必須是主鍵,或者他們在表中具有唯一的約束,並且該表正要連接到帶有位圖索引的表。



對於較小的表(記錄少於1000行)oracle中基於成本優化器通常會在只查詢到1%的記錄的情況下,使用索引。返回的行越少,就越需要索引。
create index sale2_idx1 on sale2(cust_id) tablespace rich storage (inital 400m next 10m pctincrease 0)
storage 子句基於表和列的大小,這個表超過2500萬行,索引空間大概時461MB。
如果爲表空間指定自動段空間管理,則可以讓oracle自動關聯段的空間從而達到最優性能。
可以執行alter session set sort_area_size=500000000 這樣索引創建會更快。


當發現無效索引的查詢時,限制索引應該是第一反應應該找出索引對其他查詢的影響。
使用alter index命令來初始化監控工作,然後通過對視圖v$object_usage的查詢實現索引的跟蹤。
alter index HRDT_index1 moitoring usage;
select index_name,table_name,monitoring,used,start_monitoring,end_monitoring from v$object_usage.
-----------------限制的因素
使用不等運算符(> < !=);使用 is null,is not null ,使用函數,比較不匹配的數據類型

-----------------索引空間利用率
(1)下面命令可用作創建索引後的基線,然後週期性運行以查看空間利用是否無效。
analyze index hr.emp_job_idx validate struture;
select pct_used from index_Stats where name='emp_job_idx';
pct_used列表明分配給使用中索引的空間的百分比。

(2)估計索引的空間需求,可以使用dbms_space程序包的create_index_Cost過程來估計索引的空間需求。
輸入變量包括執行創建索引的DDL命令以及本地計劃表的名稱(如果有)
DDL         CREATE INDEX命令
use_bytes    索引數據使用的字節數
alloc_bytes  分配給索引盤區的字節數
plan_table  使用的計劃表(默認NULL)

------------------索引對其他的影響
雖然索引通過加速查詢而提供了巨大的優點,但它對數據庫中的空間利用率具有一定的影響。
1.如果沒有完全使用索引,索引佔用的空間就可以更好地用於其他某個位置。
2.如果不需索引,也可以節省對索引有影響的插入,更新和刪除操作的處理時間。
索引影響查詢和數據加載性能,在inset操作期間,行的順序對加載性能有很很重要的影響。在insert之前對行進行適當的排序都可以將加載性能改進50%。
如果塊中沒有更多的空間添加新值,則該塊不是索引中的最後一個塊,塊的條目將一分爲二,一半的索引條目將保留在原始塊中,而另一半移動到新的塊中。
結果:性能在加載期間以及查詢期間受到損害。
從加載率的角度來看,贊成使用較少的多列索引,而不是使用多個單列的索引。


---------------------------------------------------------提示

確保正確使用提示的最佳方式就是運行explan plan 或設置autotrace爲on來查看提示是否被用。使用別名時,提示別名而不是表名。
按照功能分類
--------a:改變執行路徑,
當優化器處理特定語句時,提示可用修改相應的執行路徑。實例級參數optimizer_mode可以修改數據庫中的所有語句,使其遵循特定的執行路徑。
但不同執行路徑的提示會覆蓋原先初始化參數文件指定的任何信息。
1.first_rows提示可用最快速度檢索第一行,還可用指定需要利用first_rows來優化的行數,默認1.這個值介於10-1000之間。
   如果很小,成本優化器會生成包括嵌套循環以及索引查找的計劃。
   如果很大,成本優化器就會生成由散列連接和全表掃描組成的計劃(類似all_rows)
 (1)在使用update ,delete時可忽略first_rows提示,因爲查詢的所有行都會被更新或刪除。
(2)使用分組語句(group by ,distinct,intersect,minus,union)同時也會忽略first_rows提示,因爲進行分組時必須檢索所有的行。
(3)當語句中有order by子句時,如果索引掃描可以進行實際的排序工作這條語句會選擇避免排序。
(4)當索引掃描可用,並且索引處於內部表時,優化器將選擇nested loops而不是sortmerge 內部表會縮短連接到查詢中外部表的結果集大小指定訪問路徑會重寫該提示。
2.all_Rows提示以最快速度檢索出所有行,all_rows提示可能會限制正常條件下索引的應用,指定訪問路徑的提示會重寫這個提示的使用。

-----------b:使用訪問方法提示:
訪問方法組中的提示允許編碼人員改變訪問實際的查詢方式。
1.full提示對指定的表進行全表掃描,full提示也會得到不可預期的結果,因爲使用了不同的驅動表。
2.inedx ,no_index  index提示強制使用一個或多個索引。如果沒有指定索引,index提示將不會進行全表掃描,即使沒有指定任何索引,優化器也會爲這個查詢選擇最佳的索引。
3.index_join提示可用將同一個表的各個不同索引進行合併,這樣只需訪問這些索引就行了,節省了重新檢索表的時間。
            index_join提示不僅允許您只訪問表上的索引,這樣可以掃描更少的代碼塊,並且它比使用索引並通過rowid掃描表要快5倍。
4.index_combine 提示用來指定多個位圖索引
5.index_Asc
6.index_Desc
7.index_ffs 執行一次索引的快速全局掃描,這個提示只訪問索引而不是對應的表,只有查詢需要檢索的信息都會在索引上才使用索引的快速全局掃描。index_ffs只會處理索引,它不會處理結果和訪問表。

----------c:使用連接操作提示,
提示的連接操作組顯示瞭如何將連接表中的數據合併在一起。
1.order 告訴優化器基於from子句中的表順序連接這些表,並且使用第一個表作爲驅動。order提示時幾個功能最強大的提示之一。它按照from子句中列出的先後順序來處理查詢中的表。許多變化都會
改變這種運行方式。oracle版本,表中索引的存在與否以及是否是已分析過表,當多表連接非常慢並且您不知道該做什麼時,可以嘗試使用order提示。
2.leading 提示可允許您指定驅動查詢的表,優化器可判斷在使用這個表後該使用那個表。
3.use_merge
4.use_nl
5.use_hash

----------d:其他提示
1.push_subq這個提示的最佳情況時當子查詢只快速返回相對少的行時,這些行可用於充分限制外部查詢中的行,push_subq可以在儘可能早的時間對子查詢進行評估,當使用合併連接或帶有遠程表的連接時,那就不能使用該提示。
2.praaller 執行全表掃描的查詢分成多個部分執行,然後在不同的操作系統進程中處理每個部分
3.append提示可以改進insert提示的性能,append提示不會檢查當前是否有插入操作所需的塊空間,相反他會直接將數據添加到該新塊中
4.cache提示會將全表掃描全部緩存(固定)到內存中,訪問同一個表的用戶可直接在內存中查找數據,而不用到磁盤中進行查找。
5.hash
6.cursor_sharing_Exact
7.qb_name
8.richs_secret_hint

------------------------------------基於成本的優化器

基於成本的優化器以數據爲中心
數據庫所採用的優化器模式可以通過初始化參數optimizer_mode來設置。
choose對所有需要分析的表使用基於成本的優化。該模式對於那些結構良好的系統非常好。
oracle 10g啓動了自動統計收集,幫助提高基於成本優化器的效率
有效使用基於成本的優化器需要有規則地分析應用程序中的表和索引分析的頻率取決於對象中的改動率。

執行dbms_stats程序包的過程收集關於對象的統計。
如果分析表,也自動分析索引,也可以只分析索引,從而加速分析過程。
可以分析模式gather_schema_Stats
execute dbms_Stats.gather_Schema_Stats('practice','compute');
特殊的表gather_table_stats

可以使用analyze命令收集有關數據庫對象的統計。基於成本優化器可以使用這些統計表來確定使用的最佳執行路徑。
dba_tables,dba_tab_col_Statistics,dba_indexs查看關於表和索引的統計
dba_tab_columns 提供了一些列級別的統計
dba_part_col_statistics選項分析屬於practice模式的所有對象。也可以根據指定百分比的錶行評估統計。
estimate statistics 該選項將對象的統計基於部分數據的回顧,分心儘可能多的表,可指定進行分析的百分比,一般20%足夠。
分析數據可能需大量的排序空間,因爲分析也包括完整的表描述,應該在開始分析之前立刻改變會話設置
sort_area_size排序區域越大,則減少有可能需要將臨時表空間用於排序段。
db_file_multiblock_read_count 多塊讀取計數越大,在一次物理讀取期間哪呢該讀取越多的塊。


發佈了51 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章