ORACLE 如何查看索引重建進度情況

来源:http://www.cnblogs.com/kerrycode/archive/2016/07/15/5673224.html
-Advertisement-
Play Games

在ORACLE資料庫中,如果一個比較大的索引在重建過程中耗費時間比較長,那麼怎麼查看索引重建耗費的時間,以及完成了多少(比例)了呢,我們可以通過V$SESSION_LONGOPS視圖來查看索引重建的時間和進度。 官方文檔關於V$SESSION_LONGOPS的介紹如下 V$SESSION_LONGO... ...


   在ORACLE資料庫中,如果一個比較大的索引在重建過程中耗費時間比較長,那麼怎麼查看索引重建耗費的時間,以及完成了多少(比例)了呢,我們可以通過V$SESSION_LONGOPS視圖來查看索引重建的時間和進度。

 

官方文檔關於V$SESSION_LONGOPS的介紹如下

V$SESSION_LONGOPS

This view displays the status of various operations that run for longer than 6 seconds (in absolute time). These operations currently include many backup and recovery functions, statistics gathering, and query execution, and more operations are added for every Oracle release

To monitor query execution progress, you must be using the cost-based optimizer and you must:

Set the TIMED_STATISTICS or SQL_TRACE parameter to true

Gather statistics for your objects with the ANALYZE statement or the DBMS_STATS package

 

這個視圖顯示運行時間超過6秒的各類資料庫操作的狀態,這些操作包括備份、恢復功能,統計信息收集,以及查詢操作等。

 

要監控查詢執行進展情況,你必須是CBO優化器模式,並且滿足下麵條件:

  •    TIMED_STATISTICS或SQL_TRACE參數為true。
  •    使用DBMS_STATS包或ANLYZE語句收集、分析過對象的統計信息。

 

 

Column

DateType

Description

Description(中文)

SID

NUMBER

Session identifier

Session標識

SERIAL#

NUMBER

Session serial number

Session串號

OPNAME

VARCHAR2(64)

Brief description of the operation

操作簡要說明

TARGET

VARCHAR2(64)

The object on which the operation is carried out

操作的對象

TARGET_DESC

VARCHAR2(32)

Description of the target

目標對象說明

SOFAR

NUMBER

The units of work done so far

迄今為止完成的工作量

TOTALWORK

NUMBER

The total units of work

總工作量

UNITS

VARCHAR2(32)

The units of measurement

工作量單位

START_TIME

DATE

The starting time of operation

操作開始時間

LAST_UPDATE_TIME

DATE

Time when statistics last updated

統計項最後更新時間

TIMESTAMP

DATE

Timestamp

TIME_REMAINING

NUMBER

Estimate (in seconds) of time remaining for the operation to complete

預計完成操作的剩餘時間(秒)

ELAPSED_SECONDS

NUMBER

The number of elapsed seconds from the start of operations

從操作開始總花費時間(秒)

CONTEXT

NUMBER

Context

上下文關係

MESSAGE

VARCHAR2(512)

Statistics summary message

統計項的完整描述

USERNAME

VARCHAR2(30)

User ID of the user performing the operation

操作用戶

SQL_ADDRESS

RAW(4 | 8)

Used with the value of the SQL_HASH_VALUEcolumn to identify the SQL statement associated with the operation

SQL_HASH_VALUE

NUMBER

Used with the value of the SQL_ADDRESS column to identify the SQL statement associated with the operation

SQL_ID

VARCHAR2(13)

SQL identifier of the SQL statement associated with the operation

QCSID

NUMBER

Session identifier of the parallel coordinator

 

下麵我們來演示一下,首先構造了一個大表TEST_INDX,表TEST_INDX上建有一個索引IDX_TEST_INDX。我們開啟兩個會話視窗:

 

會話視窗1,執行下麵SQL語句:

SQL>  SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE AUDSID=USERENV('SESSIONID');
 
       SID    SERIAL# STATUS
---------- ---------- --------
       827        746 ACTIVE
 
SQL>  ALTER INDEX IDX_TEST_INDX REBUILD;
 
Index altered.
 
SQL> 

clip_image001[4]

 

在會話視窗2,執行下麵SQL

SQL> SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE AUDSID=USERENV('SESSIONID');
 
       SID    SERIAL# STATUS
---------- ---------- --------
       808       1003 ACTIVE
 
SQL> col opname format a32
SQL> col target format a32
SQL> col perwork format a12
SQL> set linesize 1200
SQL> select sid
  2        ,opname
  3        ,target
  4        ,sofar
  5        ,totalwork
  6        ,trunc(sofar/totalwork*100,2)||'%' as perwork
  7  from v$session_longops where sofar!=totalwork and sid=&sid;
Enter value for sid: 827
old   7: from v$session_longops where sofar!=totalwork and sid=&sid
new   7: from v$session_longops where sofar!=totalwork and sid=827
 
       SID OPNAME                        TARGET        SOFAR  TOTALWORK PERWORK
---------- --------------------- ------------------ ---------- ---------- --------
       827 Index Fast Full Scan      TEST.TEST_INDX    27914     157907 17.67%
 
SQL> /
Enter value for sid: 827
old   7: from v$session_longops where sofar!=totalwork and sid=&sid
new   7: from v$session_longops where sofar!=totalwork and sid=827
 
       SID OPNAME                        TARGET       SOFAR  TOTALWORK PERWORK
---------- -------------------- ------------------ ---------- ---------- -------
       827 Index Fast Full Scan   TEST.TEST_INDX      105075     157907 66.54%
 
SQL> /
Enter value for sid: 827
old   7: from v$session_longops where sofar!=totalwork and sid=&sid
new   7: from v$session_longops where sofar!=totalwork and sid=827
 
       SID OPNAME                   TARGET          SOFAR  TOTALWORK PERWORK
---------- ---------------  ------------------- ---------- ---------- --------
       827 Sort Output                              41728     175125 23.82%
 
SQL> 

clip_image002[4]

 

註意,這個SQL有時候需要一點時間才能看到結果,因為v$session_longpos中記錄的是執行時間超過6秒的操作,另外,你有時候會看到在Index Fast Full Scan之後,出現Sort Output操作。這個是索引重建時的排序操作,對這個Sort OutPut有點不清楚,在https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:3114287916999 這個鏈接裡面,看到Tom大師的這麼一個回覆:

 

It is not showing you the end to end time of the index create, it is showing you the end to end time of the STEPS within the index create.

For example, I had a sort_area_size of 1m. I created a table t with 1,000,000 rows based on all_objects. On this table, I put an index on object_id. This took many TABLE SCAN followed by SORT/MERGE followed by SORT/OUTPUT steps. Each was timed independently.

Next, I dropped that index and set my sort_area_size to 300m (large enough to avoid a sort to disk). This time, the ONLY thing in v$session_longops was a TABLE SCAN, no sort/merge, no sort/output. Since we didn't swap to disk, these steps were avoided.

So, I'll guess -- your single key index was done in memory, your concatenated key was not.

 

也就是說,如果sort_area_size足夠大,就不會出現Sort Merge或Sort Output操作,因為在sort_area_size不夠大的時候,就會使用臨時表空間的臨時段來排序。由於沒有查到較權威的官方資料,猜測是在索引重建過程中,由於sort_area_size不夠大,所以要使用磁碟排序,即使用了臨時表空間來排序,所以出現了Sort Output操作,它表示記憶體排序輸出到磁碟進行排序(當然僅僅是個人猜測,如有不正確的地方,敬請指正),另外在metalink上也看到這樣一段介紹:

 

First, there are the temporary segments that are used to store partial sort

data when the SORT_AREA_SIZE is too small to process the complete sort set

These segments are built in the user's default TEMPORARY tablespace.

Second, as the index is being rebuilt, it uses a segment which is defined as

a temporary segment until the rebuild is complete. Once this segment is fully

populated, the old index can be dropped and this temporary segment is redefined

as a permanent segment with the index name.

 

 

下麵我們對索引重建做一個10046跟蹤

 
SQL> alter session set events '10046 trace name context forever, level 12';
 
Session altered.
 
SQL> ALTER INDEX TEST.IDX_TEST_INDX REBUILD;
 
 
Index altered.
SQL> alter session set events '10046 trace name context off';
 
Session altered.

此時在trc文件裡面,你會看到大量的'direct path read temp'等待事件,表示重建索引時用到了臨時表空間做磁碟排序操作,由於索引非常大,所以產生了這個等待事件。

clip_image003[4]

clip_image004[4]

 

如果跟蹤一個非常小的索引重建,你在跟蹤文件裡面是看不到這個信息的。

 
SQL> alter session set events '10046 trace name context forever, level 12';
 
Session altered.
 
SQL> alter index scott.pk_emp rebuild;
 
Index altered.
 
SQL> alter session set events '10046 trace name context off';
 
Session altered.
 
SQL> 

clip_image005[4]

 

如果你根本不知道會話信息,如果我只知道是在那個表上重建索引,也可以根據表名來查詢,如下所示,我們還增加了開始時間等欄位

 

SQL> col opname format a32
SQL> col target format a32
SQL> col start_time format a24
SQL> col elapsed_seconds format 99
SQL> col perwork format a12
SQL> select sid
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • App Store: 天的故事 1. 界面優化 2. 修複bug App Store: 天的故事 ...
  • 02
    02 ...
  • 相信大家都熟悉自動識別提示吧,在我們的生活中隨處可見,今天就讓我為大家簡單介紹一下它是如何設計的。 所謂自動識別輸入即是根據用戶輸入的已有信息,為用戶提示可能的值,方便用戶完成輸入。在Android設備上這種功能分為:AutoCompleteTextView和MultiAutoCompleteTex ...
  • 這兩天使用Reveal工具查看"手機淘寶"App的UI層次時,發現其圖片輪播使用了三個UIButton的復用來實現的圖片迴圈無縫滾動。於是乎就有了今天這篇博客,看到“手機淘寶”這個幻燈片的UI層級時,就想要動手使用三個Button來實現一下,當然本篇博客使用是Swift語言,思路就是使用三個Butt ...
  • -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { /* 1,不使用動畫 UIViewAnimationTransitionNone 2,從左向右旋轉翻頁 UIViewAnimationTransitionFlipFro ...
  • 當 IDENTITY_INSERT 設置為 OFF 時,不能向表 '#TT' 中的標識列插入顯式值。我是在SqlServer寫存儲過程中遇到的這個錯誤,當時就心想:臨時表怎麼會有主鍵呢,我也沒有設置主鍵。然後我就和同事一塊調試,終於發現了。原因就是我把真實的數據表中id(其實就是主鍵)取出來放到臨時 ...
  • 1、準備文件並設置編碼格式為UTF-8並上傳Linux 2、新建一個Java Project 3、導入jar 4、編寫Map()和Reduce() 5、將代碼輸出成jar 6、在linux中啟動hdfs 7、修改兩個配置文件 8、在linux中啟動yarn 9、運行mapReduce 10、查看運行 ...
  • nfluxDB是一個當下比較流行的時序資料庫,InfluxDB使用 Go 語言編寫,無需外部依賴,安裝配置非常方便,適合構建大型分散式系統的監控系統。 本文是一系列InfluxDB學習教程的目錄,現主要包含以下文章。 InfluxDB學習之InfluxDB的安裝和簡介 InfluxDB學習之Infl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...