表格作業統計資料

Spanner 提供內建資料表,可記錄資料表 (包括變更串流資料表) 和索引的讀取 (或查詢)、寫入和刪除作業統計資料。您可以透過資料表作業統計資料執行下列操作:

  • 找出寫入流量增加的資料表,這些資料表對應的儲存空間也會增加。

  • 找出讀取、寫入和刪除流量超出預期的資料表。

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

無論存取的資料列數量為何,只要查詢或寫入資料表,資料表的對應作業數就會增加 1。

您可以在「系統洞察」圖表中,使用 Operations per secondOperations per second by API method 和其他相關指標,監控資料庫的整體每秒作業次數指標。

存取資料表作業統計資料

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

  • Google Cloud 控制台中的資料庫 Spanner Studio 頁面。

  • gcloud spanner databases execute-sql 指令。

  • executeSqlexecuteStreamingSql 方法。

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

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

表格作業統計資料

下列資料表會追蹤特定時間範圍內,資料表和索引的讀取 (或查詢)、寫入和刪除統計資料:

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE:每分鐘間隔內的操作次數
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE:10 分鐘間隔期間內的操作
  • SPANNER_SYS.TABLE_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 資料表或索引的名稱。
READ_QUERY_COUNT INT64 從資料表讀取的查詢或讀取次數。
WRITE_COUNT INT64 寫入資料表的查詢數。
DELETE_COUNT INT64 對資料表執行刪除作業的查詢數量。

如果您使用變異將資料插入資料庫,則插入陳述式存取的每個表格都會使 write_count 遞增 1。此外,如果查詢存取索引,但未掃描基礎資料表,則只會遞增索引的 read_query_count

資料保留

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

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE:涵蓋前 6 個小時的間隔。

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE:涵蓋前 4 天的間隔。

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

查詢範例

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

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

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

查詢最近一段時間內,刪除作業次數最多的資料表和索引

    SELECT interval_end,
          table_name,
          delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY delete_count DESC;
  

查詢在最近間隔內讀取和查詢作業次數最多的資料表和索引

    SELECT interval_end,
          table_name,
          read_query_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY read_query_count DESC;
  

查詢過去 6 小時的資料表用量

GoogleSQL

    SELECT interval_end,
          read_query_count,
          write_count,
          delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE table_name = "table_name"
    ORDER BY interval_end DESC;
    

其中:

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

PostgreSQL

    SELECT interval_end,
          read_query_count,
          write_count,
          delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE table_name = 'table_name'
    ORDER BY interval_end DESC;
    

其中:

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

查詢過去 14 天的資料表用量

GoogleSQL

SELECT interval_end,
       read_query_count,
       write_count,
       delete_count
FROM spanner_sys.table_operations_stats_hour
WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)
      AND table_name = "table_name"
ORDER BY interval_end DESC;

其中:

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

PostgreSQL

SELECT interval_end,
   read_query_count,
   write_count,
   delete_count
FROM spanner_sys.table_operations_stats_hour
WHERE interval_end > spanner.timestamptz_subtract(now(), '14 DAY')
  AND table_name = 'table_name'
ORDER BY interval_end DESC;

其中:

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

查詢過去 24 小時內未使用的資料表和索引

GoogleSQL

(SELECT t.table_name
 FROM  information_schema.tables AS t
 WHERE t.table_catalog = ""
   AND t.table_schema = ""
   AND t.table_type = "BASE TABLE"
 UNION ALL
 SELECT cs.change_stream_name
 FROM information_schema.change_streams cs
 WHERE cs.change_stream_catalog = ""
   AND cs.change_stream_schema = ""
 UNION ALL
 SELECT idx.index_name
 FROM information_schema.indexes idx
 WHERE idx.index_type = "INDEX"
   AND idx.table_catalog = ""
   AND idx.table_schema = "")
 EXCEPT ALL
(SELECT  DISTINCT(table_name)
 FROM spanner_sys.table_operations_stats_hour
 WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -24 HOUR));

後續步驟

  • 使用「資料表大小統計資料」 判斷資料表和索引的大小。

  • 瞭解其他內省工具

  • 進一步瞭解 Spanner 適用的 SQL 最佳做法