熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

重建索引(rebuild index)與sort

2013-11-13 16:12:24  來源: Oracle 

  重建索引到底要不要排序?有人說要因為創建索引時需要排序有人說不要因為重建索引的時候可以直接掃描舊的索引來重建成新的索引讓我們來看一下rebuild index到底需不需要排序
  
  SQL> select namestatistic# from v$statname where name like %sort%;
  
  NAME                               STATISTIC#
  
  sorts (memory)                         
  sorts (disk)                          
  sorts (rows)                          
  
  看一下排序操作相關的 stat號
  
  再看一下rebuild index 的執行路徑 SQL> explain plan for alter index ind_test_id rebuild;
  
  Explained
  
  SQL> @?/rdbms/admin/utlxpls
  
  PLAN_TABLE_OUTPUT
  
  | Id | Operation       | Name    | Rows | Bytes | Cost |
  
  |  | ALTER INDEX STATEMENT |       | | |   |
  |  | INDEX BUILD NON UNIQUE| IND_TEST_ID |    |    |    |
  |  |  SORT CREATE INDEX  |       | | |    |
  |  |  INDEX FAST FULL SCAN| IND_TEST_ID | | |   |
  
  執行下rebuild 看看
  
  SQL> select STATISTIC#value from v$mystat where STATISTIC# in();
  STATISTIC#   VALUE
  
          
           
          
  
  
  SQL> alter index ind_test_id rebuild;
  
  Index altered
  
  SQL> select STATISTIC#value from v$mystat where STATISTIC# in();
  STATISTIC#   VALUE
  
          
           
          
  可以看出sort(memory)增加了一次
  
  為什麼要排序呢?因為rebuild index的時候走的index ffs而ffs搜索的順序是根據 leaf block 的物理存儲順序相關而跟鍵值的邏輯順序無關(在index full scan vs fast index full scan這篇文章中有詳細介紹) 所以ffs的結果必須再做一次排序
  
  此外在rebulid index online的時候走的是full table scan這時候也是需要排序的而且排序的次數會比較多 在測試中發現每次做rebuild online產生g中為)次sort(memory)可能跟一些遞規排序有關系g裡面重建索引排序又有了一些改變事件的跟蹤文件裡面出現Reopened sort目前暫時不知道是什麼意思希望有朋友能就這個問題進行探討
From:http://tw.wingwit.com/Article/program/Oracle/201311/17962.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.