Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

メトリクスと分析

最終更新 Markdown で表示Agent セットアップ

D1 はデータベース分析を公開しており、アカウント内のすべてのデータベース、または各データベースについて、クエリ量、クエリレイテンシ、ストレージサイズを確認できます。

Cloudflare ダッシュボード のチャートに表示されるメトリクスは、Cloudflare の GraphQL Analytics API から取得しています。GraphQL または HTTP クライアントから プログラムで メトリクスにアクセスできます。

メトリクス

D1 が現在エクスポートしているメトリクスは次のとおりです。

メトリクス GraphQL フィールド名 説明
読み取りクエリ (qps) readQueries データベースに対して発行された読み取りクエリの数です。読み取りクエリの生の件数であり、課金には使いません。
書き込みクエリ (qps) writeQueries データベースに対して発行された書き込みクエリの数です。書き込みクエリの生の件数であり、課金には使いません。
読み取り行数 (件数) rowsRead クエリ全体で読み取った(スキャンした)行数です。行の数え方について、詳しくは 料金 を参照してください。
書き込み行数 (件数) rowsWritten クエリ全体で書き込んだ行数です。
クエリ応答 (bytes) queryBatchResponseBytes シリアル化したクエリ応答の合計サイズです。列名、行、メタデータをすべて含みます。単位はバイトです。
クエリレイテンシ (ms) queryBatchTimeMs サーバー側のクエリ応答時間の合計です。応答のシリアル化を含みます。単位はミリ秒です。
ストレージ (Bytes) databaseSizeBytes データベースの最大サイズです。単位はバイトです。

メトリクスは過去 31 日間を対象にクエリでき、同じ期間保持されます。

行数

D1 は、Workers Binding API 経由で、個々のクエリの応答に読み取り行数、書き込み行数(またはその両方)を返します。

行数は、そのクエリが読み取った(スキャンした)行、または書き込んだ行の正確な件数です。 行数を確認すると、クエリのパフォーマンスとコストを把握できます。インデックス で読み取り行数を減らせるかどうかも判断できます。クエリ件数は、データベースに対するトラフィックの総量を把握し、どのデータベースが実際に使われているかを見分けるために使います。

行の数え方について、詳しくは 料金のドキュメント を参照してください。

ダッシュボードでメトリクスを確認する

D1 のデータベース単位の分析は、Cloudflare ダッシュボードで確認できます。データベースの現在および過去のメトリクスを表示する手順は次のとおりです。

  1. Cloudflare ダッシュボードで、D1 ページに移動します。

    D1 SQL database を開く ↗
  2. 既存の D1 データベースを選択します。

  3. Metrics タブを選択します。

必要に応じて、クエリする時間範囲を選べます。デフォルトは直近 24 時間です。

GraphQL API でクエリする

GraphQL Analytics API を使って、D1 データベースの分析をプログラムからクエリできます。この API は Cloudflare ダッシュボードと同じデータセットを参照し、GraphQL の イントロスペクション にも対応しています。

D1 の GraphQL データセットには、Cloudflare アカウント ID を指定する accountTag フィルターが必要です。含まれるデータセットは次のとおりです。

  • d1AnalyticsAdaptiveGroups
  • d1StorageAdaptiveGroups
  • d1QueriesAdaptiveGroups

指定した $databaseId について readQuerieswriteQueries の合計を、databaseIddate でグループ化してクエリします。

query D1ObservabilitySampleQuery(
	$accountTag: string!
	$start: Date
	$end: Date
	$databaseId: string
) {
	viewer {
		accounts(filter: { accountTag: $accountTag }) {
			d1AnalyticsAdaptiveGroups(
				limit: 10000
				filter: { date_geq: $start, date_leq: $end, databaseId: $databaseId }
				orderBy: [date_DESC]
			) {
				sum {
					readQueries
					writeQueries
				}
				dimensions {
					date
					databaseId
				}
			}
		}
	}
}

データベースごとに、平均の queryBatchTimeMs と 90 パーセンタイルの queryBatchTimeMs をクエリします。

query D1ObservabilitySampleQuery2(
	$accountTag: string!
	$start: Date
	$end: Date
	$databaseId: string
) {
	viewer {
		accounts(filter: { accountTag: $accountId }) {
			d1AnalyticsAdaptiveGroups(
				limit: 10000
				filter: { date_geq: $start, date_leq: $end, databaseId: $databaseId }
				orderBy: [date_DESC]
			) {
				quantiles {
					queryBatchTimeMsP90
				}
				dimensions {
					date
					databaseId
				}
			}
		}
	}
}

アカウント全体の readQuerieswriteQueries をクエリします。

query D1ObservabilitySampleQuery3(
	$accountTag: string!
	$start: Date
	$end: Date
	$databaseId: string
) {
	viewer {
		accounts(filter: { accountTag: $accountTag }) {
			d1AnalyticsAdaptiveGroups(
				limit: 10000
				filter: { date_geq: $start, date_leq: $end, databaseId: $databaseId }
			) {
				sum {
					readQueries
					writeQueries
				}
			}
		}
	}
}

insights をクエリする

D1 は、クエリ性能の把握とデバッグに使えるメトリクスを提供します。GraphQL の d1QueriesAdaptiveGroups、または wrangler d1 insights コマンドからアクセスできます。

D1 はクエリ文字列を記録するため、実行ごとのメトリクスを分析しやすくなっています。機密情報を除くため、バインドパラメーター は記録しません。

オプション 説明
--timePeriod 現在から指定した期間までのデータを取得します(デフォルト: 1d)。
--sort-type insights の並び替えに使う演算です。sum または avg を選びます(デフォルト: sum)。
--sort-by insights の並び替えに使うフィールドです。timereadswritescount から選びます(デフォルト: time)。
--sort-direction 並び順です。ASC または DESC を選びます(デフォルト: DESC)。
--json 結果を整形した JSON で返すかどうかを指定する真偽値です(デフォルト: false)。
--limit 取得するクエリの最大数です。

実行回数が多い上位 3 件のクエリを探す:

npx wrangler d1 insights <database_name> --sort-type=sum --sort-by=count --limit=3
 ⛅️ wrangler 3.95.0
-------------------

-------------------
🚧 `wrangler d1 insights` is an experimental command.
🚧 Flags for this command, their descriptions, and output may change between wrangler versions.
-------------------

[
  {
    "query": "SELECT tbl_name as name,\n                   (SELECT ncol FROM pragma_table_list(tbl_name)) as num_columns\n            FROM sqlite_master\n            WHERE TYPE = \"table\"\n              AND tbl_name NOT LIKE \"sqlite_%\"\n              AND tbl_name NOT LIKE \"d1_%\"\n              AND tbl_name NOT LIKE \"_cf_%\"\n            ORDER BY tbl_name ASC;",
    "avgRowsRead": 2,
    "totalRowsRead": 4,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 0.49505,
    "totalDurationMs": 0.9901,
    "numberOfTimesRun": 2,
    "queryEfficiency": 0
  },
  {
    "query": "SELECT * FROM Customers",
    "avgRowsRead": 4,
    "totalRowsRead": 4,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 0.1873,
    "totalDurationMs": 0.1873,
    "numberOfTimesRun": 1,
    "queryEfficiency": 1
  },
  {
    "query": "SELECT * From Customers",
    "avgRowsRead": 0,
    "totalRowsRead": 0,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 1.0225,
    "totalDurationMs": 1.0225,
    "numberOfTimesRun": 1,
    "queryEfficiency": 0
  }
]

平均実行時間が長い上位 3 件のクエリを探す:

npx wrangler d1 insights <database_name> --sort-type=avg --sort-by=time --limit=3
⛅️ wrangler 3.95.0
-------------------

-------------------
🚧 `wrangler d1 insights` is an experimental command.
🚧 Flags for this command, their descriptions, and output may change between wrangler versions.
-------------------

[
  {
    "query": "SELECT * From Customers",
    "avgRowsRead": 0,
    "totalRowsRead": 0,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 1.0225,
    "totalDurationMs": 1.0225,
    "numberOfTimesRun": 1,
    "queryEfficiency": 0
  },
  {
    "query": "SELECT tbl_name as name,\n                   (SELECT ncol FROM pragma_table_list(tbl_name)) as num_columns\n            FROM sqlite_master\n            WHERE TYPE = \"table\"\n              AND tbl_name NOT LIKE \"sqlite_%\"\n              AND tbl_name NOT LIKE \"d1_%\"\n              AND tbl_name NOT LIKE \"_cf_%\"\n            ORDER BY tbl_name ASC;",
    "avgRowsRead": 2,
    "totalRowsRead": 4,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 0.49505,
    "totalDurationMs": 0.9901,
    "numberOfTimesRun": 2,
    "queryEfficiency": 0
  },
  {
    "query": "SELECT * FROM Customers",
    "avgRowsRead": 4,
    "totalRowsRead": 4,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 0.1873,
    "totalDurationMs": 0.1873,
    "numberOfTimesRun": 1,
    "queryEfficiency": 1
  }
]

直近 7 日間で書き込み行数が多い上位 10 件のクエリを探す:

npx wrangler d1 insights <database_name> --sort-type=sum --sort-by=writes --limit=10 --timePeriod=7d
⛅️ wrangler 3.95.0
-------------------

-------------------
🚧 `wrangler d1 insights` is an experimental command.
🚧 Flags for this command, their descriptions, and output may change between wrangler versions.
-------------------

[
  {
    "query": "SELECT * FROM Customers",
    "avgRowsRead": 4,
    "totalRowsRead": 4,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 0.1873,
    "totalDurationMs": 0.1873,
    "numberOfTimesRun": 1,
    "queryEfficiency": 1
  },
  {
    "query": "SELECT * From Customers",
    "avgRowsRead": 0,
    "totalRowsRead": 0,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 1.0225,
    "totalDurationMs": 1.0225,
    "numberOfTimesRun": 1,
    "queryEfficiency": 0
  },
  {
    "query": "SELECT tbl_name as name,\n                   (SELECT ncol FROM pragma_table_list(tbl_name)) as num_columns\n            FROM sqlite_master\n            WHERE TYPE = \"table\"\n              AND tbl_name NOT LIKE \"sqlite_%\"\n              AND tbl_name NOT LIKE \"d1_%\"\n              AND tbl_name NOT LIKE \"_cf_%\"\n            ORDER BY tbl_name ASC;",
    "avgRowsRead": 2,
    "totalRowsRead": 4,
    "avgRowsWritten": 0,
    "totalRowsWritten": 0,
    "avgDurationMs": 0.49505,
    "totalDurationMs": 0.9901,
    "numberOfTimesRun": 2,
    "queryEfficiency": 0
  }
]

役に立ちましたか?