經過長時間學習Oracle primary索引,於是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會你更多東西。有經驗的Oracle DBA都知道I/O是響應時間的最大組成部分。其中磁盤I/O特別厲害,因為當Oracle由磁盤上的一個數據文件得到一個數據塊時,讀的進程就必須等待物理I/O操作完成。磁盤操作要比數據緩沖慢10,000倍。因此,如果可以令I/O最小化,或者減少由於磁盤上的文件競爭而帶來的瓶頸,就可以大大地改善Oracle數據庫的性能。
如果系統響應很慢,通過減少磁盤I/O就可以有一個很快的改善。如果在一個事務中通過按一定的范圍搜索Oracle primary索引來訪問表,那麼重新以CTAS的方法組織表將是你減少I/O的首要策略。通過在物理上將行排序為和Oracle primary索引一樣的順序,就可以加快獲得數據的速度。
就象磁盤的負載平衡一樣,行的重新排序也是很簡單的,而且也很快。通過與其它的DBA管理技巧一起使用,就可以在高I/O的系統中大大地減少響應的時間。
在高容量的在線事務處理環境中(online transaction processing,OLTP),數據是由一個Oracle primary索引得到的,重新排序表格的行就可以令連續塊的順序和它們的Oracle primary索引一樣,這樣就可以在索引驅動的表格查詢中,減少物理I/O並且改善響應時間。這個技巧僅在應用選擇多行的時候有用,或者在使用索引范圍搜索和應用發出多個查詢來得到連續的key時有效。對於隨機的唯一primary-key(主鍵)的訪問將不會由行重新排序中得到好處。
讓我們看一下它是如何工作的。考慮以下的一個SQL的查詢,它使用一個索引來得到100行:
- selectsalaryfromemployeewherelast_name like 'B%';
這個查詢將會使用last_name_index,搜索其中的每一行來得到目標行。這個查詢將會至少使用100次物理磁盤的讀取,因為employee的行存放在不同的數據塊中。
不過,如果表中的行已經重新排序為和last_name_index的一樣,同樣的查詢又會怎樣處理呢?我們可以看到這個查詢只需要三次的磁盤I/O就讀完全部100個員工的資料(一次用作索引的讀取,兩次用作數據塊的讀取),減少了97次的塊讀取。
重新排序帶來的性能改善的程度在於在你開始的時候行的亂序性如何,以及你需要由序列中訪問多少行。至於一個表中的行與索引的排序鍵的匹配程度,可以查看數據字典中的dba_indexes和dba_tables視圖得到。
在dba_indexes的視圖中,查看clustering_factor列。如果clustering_factor的值和表中的塊數目大致一樣,那麼你的表和索引的順序是一樣的。不過,如果clustering_factor的值接近表中的行數目,那就表明表格中的行和索引的順序是不一樣的。
行重新排序的作用是不可以小看的。在需要進行大范圍的索引搜索的大表中,行重新排序可以令查詢的性能提高三倍。
一旦你已經決定重新排序表中的行,你可以使用以下的工具之一來重新組織表格。
◆使用Oracle的Create Table As Select (CTAS)語法來拷貝表格
◆Oracle9i自帶的表格重新組織工具