Spanner 提供內建資料表,可記錄資料表 (包括變更串流資料表) 和索引的讀取 (或查詢)、寫入和刪除作業統計資料。您可以透過資料表作業統計資料執行下列操作:
找出寫入流量增加的資料表,這些資料表對應的儲存空間也會增加。
找出讀取、寫入和刪除流量超出預期的資料表。
找出使用率高的資料表。
無論存取的資料列數量為何,只要查詢或寫入資料表,資料表的對應作業數就會增加 1。
您可以在「系統洞察」圖表中,使用 Operations per second
、Operations per second by API method
和其他相關指標,監控資料庫的整體每秒作業次數指標。
存取資料表作業統計資料
Spanner 會在 SPANNER_SYS
結構定義中提供資料表作業統計資料。您可以透過下列方式存取 SPANNER_SYS
資料:
Google Cloud 控制台中的資料庫 Spanner Studio 頁面。
gcloud spanner databases execute-sql
指令。
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));