資料欄作業統計資料

Spanner 提供內建資料表,可記錄資料表欄的讀取、查詢和寫入作業統計資料。您可以使用資料欄作業統計資料執行下列操作:

  • 找出讀取、查詢和寫入流量超出預期的資料欄。

  • 找出使用率高的資料欄。

無論存取的資料列數量為何,只要您查詢或寫入資料欄,Spanner 就會將該資料欄的對應作業計數加 1。

您可以透過每秒作業數、每秒作業數 (依 API 方法) 等指標,以及系統洞察圖表中的其他相關指標,監控資料庫的整體狀況。

存取資料欄作業統計資料

Spanner 會在 SPANNER_SYS 結構定義中提供資料欄作業統計資料。您可以透過下列方式存取 SPANNER_SYS 資料:

Spanner 提供的下列單一讀取方法不支援 SPANNER_SYS

  • 從資料表中的單一資料列或多個資料列執行強式讀取。
  • 從資料表中的單一資料列或多個資料列執行過時讀取。
  • 從次要索引中的單一資料列或多個資料列讀取。

詳情請參閱「單一讀取方法」。

資料欄作業統計資料

下列資料表會追蹤特定時間範圍內,資料欄的讀取、查詢和寫入統計資料:

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE:1 分鐘間隔內的作業
  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE:10 分鐘間隔期間內的操作
  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR:每隔 1 小時的作業

這些資料表具備下列屬性:

  • 每個資料表都包含資料表名稱所指定的非重疊時間間隔長度的資料。

  • 1 分鐘間隔的開始時間是目前這一分鐘、10 分鐘間隔的開始時間是目前這個小時的每 10 分鐘,而 1 小時間隔的開始時間是目前這個小時。

    舉例來說,在上午 11:59:30,SQL 查詢可存取下列最近間隔:

    • 1 分鐘:上午 11:58:00–11:58:59
    • 10 分鐘:上午 11:40:00–11:49:59
    • 1 小時:上午 10:00:00–10:59:59

所有資料欄作業統計資料表的結構定義

資料欄名稱 類型 說明
INTERVAL_END TIMESTAMP 收集欄使用統計資料的時間間隔結束時間。
TABLE_NAME STRING 資料表或索引的名稱。
COLUMN_NAME STRING 資料欄名稱。
READ_COUNT INT64 從資料欄讀取的次數。
QUERY_COUNT INT64 從資料欄讀取的查詢次數。
WRITE_COUNT INT64 寫入資料表的查詢數。
IS_QUERY_CACHE_MEMORY_CAPPED BOOL 統計資料收集是否因記憶體壓力而受到限制。

如果您使用變異將資料插入資料庫,Spanner 會針對插入陳述式存取的每個資料表,將 WRITE_COUNT 遞增 1。此外,如果查詢存取索引時未掃描基礎資料表,則只會遞增索引的 QUERY_COUNT

資料保留

Spanner 至少會在下列時間範圍保留每個資料表的資料:

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE:涵蓋前六個小時的間隔。

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE:涵蓋前四天的間隔。

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR:涵蓋前 30 天的間隔。

查詢範例

本節包含多個範例 SQL 陳述式,可擷取匯總的資料欄作業統計資料。您可以使用用戶端程式庫Google Cloud CLI 執行這些 SQL 陳述式。

查詢最近時間間隔內寫入作業次數最多的資料表欄

GoogleSQL

    SELECT interval_end,
          table_name,
          column_name,
          write_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.column_operations_stats_minute)
    ORDER BY write_count DESC;

PostgreSQL

    SELECT interval_end,
          table_name,
          column_name,
          write_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.column_operations_stats_minute)
    ORDER BY write_count DESC;

查詢最近時間間隔內查詢作業最多的資料欄

GoogleSQL

    SELECT interval_end,
          table_name,
          column_name,
          query_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.column_operations_stats_minute)
    ORDER BY query_count DESC;

PostgreSQL

    SELECT interval_end,
          table_name,
          column_name,
          query_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.column_operations_stats_minute)
    ORDER BY query_count DESC;

查詢過去 6 小時內資料欄的使用情形

GoogleSQL

    SELECT interval_end,
          read_count,
          query_count,
          write_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE table_name = "table_name"
          AND column_name = "column_name"
    ORDER BY interval_end DESC;
    

其中:

  • table_name 必須是資料庫中現有的資料表或索引。
  • column_name」必須是表格中的現有資料欄。

PostgreSQL

    SELECT interval_end,
          read_count,
          query_count,
          write_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE table_name = 'table_name'
          AND column_name = 'column_name'
    ORDER BY interval_end DESC;
    

其中:

  • table_name 必須是資料庫中現有的資料表或索引。
  • column_name」必須是表格中的現有資料欄。

查詢過去 14 天的資料欄使用情形

GoogleSQL

SELECT interval_end,
       read_count,
       query_count,
       write_count
FROM spanner_sys.column_operations_stats_hour
WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)
      AND table_name = "table_name"
      AND column_name = "column_name"
ORDER BY interval_end DESC;

請將下列項目改為對應的值:

  • table_name:資料庫中的資料表或索引名稱。
  • column_name:資料表中的資料欄名稱。

PostgreSQL

SELECT interval_end,
   read_count,
   query_count,
   write_count
FROM spanner_sys.column_operations_stats_hour
WHERE interval_end > spanner.timestamptz_subtract(now(), '14 DAY')
  AND table_name = 'table_name'
  AND column_name = 'column_name'
ORDER BY interval_end DESC;

請將下列項目改為對應的值:

  • table_name:資料庫中的資料表或索引名稱。
  • column_name:資料表中的資料欄名稱。

後續步驟