對於等待、階段、陳述式和交易事件,效能架構可以監控並儲存目前的事件。此外,當事件結束時,效能架構可以將它們儲存在歷史表格中。對於每種事件類型,效能架構使用三個表格來儲存目前和歷史事件。表格的名稱具有以下形式,其中 xxx
表示事件類型(waits
、stages
、statements
、transactions
)
events_
:「目前事件」表格儲存每個執行緒目前監控的事件(每個執行緒一列)。xxx
_currentevents_
:「最近歷史」表格儲存每個執行緒已結束的最近事件(每個執行緒最多列數)。xxx
_historyevents_
:「長歷史」表格儲存全域已結束的最近事件(跨所有執行緒,每個表格最多列數)。xxx
_history_long
每個事件類型的 _current
表格包含每個執行緒一列,因此沒有用於設定其最大大小的系統變數。效能架構會自動調整歷史表格的大小,或者可以在伺服器啟動時使用特定表格的系統變數明確設定大小,如描述個別歷史表格的章節中所述。典型的自動調整大小的值是 _history
表格每個執行緒 10 列,以及 _history_long
表格總共 10,000 列。
對於每個事件類型,_current
、_history
和 _history_long
表格都具有相同的欄。 _current
和 _history
表格具有相同的索引。 _history_long
表格沒有索引。
_current
表格會顯示伺服器內部目前正在發生的事情。當目前事件結束時,它會從其 _current
表格中移除。
_history
和 _history_long
資料表會顯示最近發生的事件。當歷史資料表滿載時,舊的事件會在新事件加入時被捨棄。_history
和 _history_long
資料表的列是以不同的方式過期,因為這些資料表服務於不同的目的。
_history
的目的是獨立於全域伺服器負載來調查個別的執行緒。_history_long
的目的是全域地調查伺服器,而非每個執行緒。
這兩種歷史資料表之間的差異與資料保留政策有關。當首次看到事件時,這兩個資料表都包含相同的資料。然而,每個資料表內的資料會隨著時間以不同的方式過期,因此資料在每個資料表中可能會保留較長或較短的時間。
對於
_history
,當資料表包含給定執行緒的最大列數時,當該執行緒新增新列時,該執行緒最舊的列會被捨棄。對於
_history_long
,當資料表滿載時,無論哪個執行緒產生了哪一列,當新增新列時,最舊的列會被捨棄。
當執行緒結束時,其所有列都會從 _history
資料表中捨棄,但不會從 _history_long
資料表中捨棄。
以下範例說明了事件如何新增至這兩種歷史資料表並從中捨棄。這些原則同樣適用於所有事件類型。該範例基於以下假設:
效能綱要設定為在
_history
資料表中每個執行緒保留 10 列,在_history_long
資料表中總共保留 10,000 列。執行緒 A 每秒產生 1 個事件。
執行緒 B 每秒產生 100 個事件。
沒有其他執行緒正在執行。
執行 5 秒後:
A 和 B 分別產生了 5 個和 500 個事件。
_history
包含 A 的 5 列和 B 的 10 列。由於每個執行緒的儲存空間限制為 10 列,因此 A 沒有捨棄任何列,而 B 捨棄了 490 列。_history_long
包含 A 的 5 列和 B 的 500 列。由於資料表的最大大小為 10,000 列,因此沒有捨棄任何執行緒的列。
執行 5 分鐘(300 秒)後:
A 和 B 分別產生了 300 個和 30,000 個事件。
_history
包含 A 的 10 列和 B 的 10 列。由於每個執行緒的儲存空間限制為 10 列,因此 A 捨棄了 290 列,而 B 捨棄了 29,990 列。A 的列包含最多 10 秒前的資料,而 B 的列僅包含最多 0.1 秒前的資料。_history_long
包含 10,000 列。由於 A 和 B 加起來每秒產生 101 個事件,因此資料表包含大約 10,000/101 = 99 秒前的資料,其中 B 的列與 A 的列之比約為 100 比 1。