Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Spanner menyediakan tabel bawaan yang mencatat statistik operasi baca, kueri, dan tulis untuk kolom tabel Anda. Dengan statistik operasi kolom, Anda dapat melakukan hal berikut:
Identifikasi kolom dengan traffic baca, kueri, dan tulis yang tidak terduga.
Identifikasi kolom yang sering digunakan.
Saat Anda membuat kueri atau menulis ke kolom, Spanner akan menaikkan jumlah operasi yang sesuai untuk kolom tersebut sebanyak satu, terlepas dari jumlah baris yang diakses.
Anda dapat memantau keseluruhan database menggunakan metrik yang mengukur
operasi per detik, operasi per detik menurut metode API, dan metrik terkait
lainnya dalam diagram System Insights.
Mengakses statistik operasi kolom
Spanner menyediakan statistik operasi kolom dalam skema SPANNER_SYS. Anda dapat menggunakan cara berikut untuk mengakses data SPANNER_SYS:
Halaman Spanner Studio database di konsol Google Cloud
Tabel berikut melacak statistik baca, kueri, dan tulis pada kolom Anda selama jangka waktu tertentu:
SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE: Operasi selama interval 1 menit
SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE: Operasi selama interval 10 menit
SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR: Operasi selama interval 1 jam
Tabel ini memiliki properti berikut:
Setiap tabel berisi data untuk interval waktu yang tidak tumpang-tindih dengan panjang yang ditentukan oleh nama tabel.
Interval 1 menit dimulai pada menit ke-0,
interval 10 menit dimulai setiap 10 menit, dimulai pada jam ke-0, dan interval 1 jam
dimulai pada jam ke-0.
Misalnya, pada pukul 11.59.30, kueri SQL dapat mengakses interval terbaru berikut:
1 menit: 11.58.00–11.58.59 AM
10 menit: 11.40.00–11.49.59 AM
1 jam: 10.00.00–10.59.59
Skema untuk semua tabel statistik operasi kolom
Nama kolom
Jenis
Deskripsi
INTERVAL_END
TIMESTAMP
Akhir interval waktu saat statistik penggunaan kolom dikumpulkan.
TABLE_NAME
STRING
Nama tabel atau indeks.
COLUMN_NAME
STRING
Nama kolom.
READ_COUNT
INT64
Jumlah pembacaan dari kolom.
QUERY_COUNT
INT64
Jumlah kueri yang membaca dari kolom.
WRITE_COUNT
INT64
Jumlah kueri yang menulis ke tabel.
IS_QUERY_CACHE_MEMORY_CAPPED
BOOL
Apakah pengumpulan statistik dibatasi karena tekanan memori.
Jika Anda memasukkan data ke database menggunakan mutasi, Spanner akan menaikkan WRITE_COUNT sebesar 1 untuk setiap tabel yang diakses oleh pernyataan penyisipan. Selain itu, kueri yang mengakses indeks tanpa memindai tabel pokok hanya akan menaikkan QUERY_COUNT pada indeks.
Retensi data
Setidaknya, Spanner menyimpan data untuk setiap tabel selama periode waktu berikut:
SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE: Interval yang mencakup enam jam sebelumnya.
SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE: Interval yang mencakup
empat hari sebelumnya.
SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR: Interval yang mencakup 30 hari sebelumnya.
Contoh kueri
Bagian ini mencakup beberapa contoh pernyataan SQL yang mengambil statistik operasi kolom gabungan. Anda dapat menjalankan pernyataan SQL ini menggunakan
library klien atau
Google Cloud CLI.
Membuat kueri kolom tabel dengan operasi tulis terbanyak untuk interval terbaru
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Sulit dipahami","hardToUnderstand","thumb-down"],["Informasi atau kode contoh salah","incorrectInformationOrSampleCode","thumb-down"],["Informasi/contoh yang saya butuhkan tidak ada","missingTheInformationSamplesINeed","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-08-11 UTC."],[],[],null,["# Column operations statistics\n\nSpanner provides built-in tables that record read, query, and write\noperation statistics for your table columns. With column operations statistics\nyou can do the following:\n\n- Identify columns with unexpected read, query, and write traffic.\n\n- Identify heavily-used columns.\n\nWhen you query or write to a column, Spanner increments the\ncorresponding operation count for that column increments by one, regardless of the\nnumber of rows accessed.\n\nYou can monitor a database's overall using metrics that measure\noperations-per-second, operations per second by API method, and other\nrelated metrics within your [System Insights](/spanner/docs/monitoring-console)\ncharts.\n\nAccess column operations statistics\n-----------------------------------\n\nSpanner provides the column operations statistics in the\n`SPANNER_SYS` schema. You can use the following to access `SPANNER_SYS` data:\n\n- A database's Spanner Studio page in the Google Cloud console\n\n- The [`gcloud spanner databases execute-sql`](/sdk/gcloud/reference/spanner/databases/execute-sql) command\n\n- The [`executeSql`](/spanner/docs/reference/rest/v1/projects.instances.databases.sessions/executeSql)\n or the [`executeStreamingSql`](/spanner/docs/reference/rest/v1/projects.instances.databases.sessions/executeStreamingSql)\n method.\n\nThe following single read methods that Spanner provides\ndon't support `SPANNER_SYS`:\n\n- Performing a strong read from a single row or multiple rows in a table.\n- Performing a stale read from a single row or multiple rows in a table.\n- Reading from a single row or multiple rows in a secondary index.\n\nFor more information, see [Single read methods](/spanner/docs/reads#single_read_methods).\n\nColumn operations statistics\n----------------------------\n\nThe following tables track the read, query, and write statistics on your columns\nduring a specific time period:\n\n- `SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE`: Operations during 1-minute intervals\n- `SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE`: Operations during 10-minute intervals\n- `SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR`: Operations during 1-hour intervals\n\nThese tables have the following properties:\n\n- Each table contains data for non-overlapping time intervals of the length that\n the table name specifies.\n\n- 1-minute intervals start on the minute,\n 10-minute intervals start every 10 minutes starting on the hour, and 1-hour\n intervals start on the hour.\n\n For example, at 11:59:30 AM, SQL queries can access the following most\n recent intervals:\n - **1 minute**: 11:58:00--11:58:59 AM\n - **10 minute**: 11:40:00--11:49:59 AM\n - **1 hour**: 10:00:00--10:59:59 AM\n\n### Schema for all column operations statistics tables\n\nIf you insert data into your database using mutations, Spanner\nincrements the `WRITE_COUNT` by 1 for each table that the insert statement\naccesses. In addition, a query that accesses an index without scanning the\nunderlying table only increments the `QUERY_COUNT` on the index.\n\nData retention\n--------------\n\nAt a minimum, Spanner keeps data for each table for the following\ntime periods:\n\n- `SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE`: Intervals covering the previous\n six hours.\n\n- `SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE`: Intervals covering the\n previous four days.\n\n- `SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR`: Intervals covering the previous 30\n days.\n\n| **Note:** You can't prevent Spanner from collecting column operations statistics. To delete the data in these tables, you must delete the database associated with them or wait until Spanner removes the data after the data retention period ends.\n\n### Example queries\n\nThis section includes several example SQL statements that retrieve aggregate\ncolumn operations statistics. You can run these SQL statements using the\n[client libraries](/spanner/docs/reference/libraries) or the\n[Google Cloud CLI](/spanner/docs/gcloud-spanner#execute_sql_statements).\n\n#### Query the table columns with the most write operations for the most recent interval\n\n### GoogleSQL\n\n\n```googlesql\n SELECT interval_end,\n table_name,\n column_name,\n write_count\n FROM spanner_sys.column_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.column_operations_stats_minute)\n ORDER BY write_count DESC;\n```\n\n\u003cbr /\u003e\n\n### PostgreSQL\n\n\n```postgresql\n SELECT interval_end,\n table_name,\n column_name,\n write_count\n FROM spanner_sys.column_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.column_operations_stats_minute)\n ORDER BY write_count DESC;\n```\n\n\u003cbr /\u003e\n\n#### Query the columns with the most query operations for the most recent interval\n\n### GoogleSQL\n\n\n```googlesql\n SELECT interval_end,\n table_name,\n column_name,\n query_count\n FROM spanner_sys.column_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.column_operations_stats_minute)\n ORDER BY query_count DESC;\n```\n\n\u003cbr /\u003e\n\n### PostgreSQL\n\n\n```postgresql\n SELECT interval_end,\n table_name,\n column_name,\n query_count\n FROM spanner_sys.column_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.column_operations_stats_minute)\n ORDER BY query_count DESC;\n```\n\n\u003cbr /\u003e\n\n#### Query the usage of a column over the last 6 hours\n\n### GoogleSQL\n\n```googlesql\n SELECT interval_end,\n read_count,\n query_count,\n write_count\n FROM spanner_sys.column_operations_stats_minute\n WHERE table_name = \"\u003cvar translate=\"no\"\u003etable_name\u003c/var\u003e\"\n AND column_name = \"\u003cvar translate=\"no\"\u003ecolumn_name\u003c/var\u003e\"\n ORDER BY interval_end DESC;\n \n```\n\nWhere:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e must be an existing table or index in the database.\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003ecolumn_name\u003c/code\u003e\u003c/var\u003e must be an existing column in the table.\n\n### PostgreSQL\n\n```postgresql\n SELECT interval_end,\n read_count,\n query_count,\n write_count\n FROM spanner_sys.column_operations_stats_minute\n WHERE table_name = '\u003cvar translate=\"no\"\u003etable_name\u003c/var\u003e'\n AND column_name = '\u003cvar translate=\"no\"\u003ecolumn_name\u003c/var\u003e'\n ORDER BY interval_end DESC;\n \n```\n\nWhere:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e must be an existing table or index in the database.\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003ecolumn_name\u003c/code\u003e\u003c/var\u003e must be an existing column in the table.\n\n#### Query the usage of a column over the last 14 days\n\n### GoogleSQL\n\n```googlesql\nSELECT interval_end,\n read_count,\n query_count,\n write_count\nFROM spanner_sys.column_operations_stats_hour\nWHERE interval_end \u003e TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)\n AND table_name = \"\u003cvar translate=\"no\"\u003etable_name\u003c/var\u003e\"\n AND column_name = \"\u003cvar translate=\"no\"\u003ecolumn_name\u003c/var\u003e\"\nORDER BY interval_end DESC;\n```\n\nMake the following replacements:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e: table or index name in the database.\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003ecolumn_name\u003c/code\u003e\u003c/var\u003e: column name in the table.\n\n### PostgreSQL\n\n```postgresql\nSELECT interval_end,\n read_count,\n query_count,\n write_count\nFROM spanner_sys.column_operations_stats_hour\nWHERE interval_end \u003e spanner.timestamptz_subtract(now(), '14 DAY')\n AND table_name = '\u003cvar translate=\"no\"\u003etable_name\u003c/var\u003e'\n AND column_name = '\u003cvar translate=\"no\"\u003ecolumn_name\u003c/var\u003e'\nORDER BY interval_end DESC;\n```\n\nMake the following replacements:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e: table or index name in the database.\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003ecolumn_name\u003c/code\u003e\u003c/var\u003e: column name in the table.\n\nWhat's next\n-----------\n\n- Learn about other [Built-in statistics tables](/spanner/docs/introspection).\n\n- Learn more about [SQL best practices](/spanner/docs/sql-best-practices) for\n Spanner."]]