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 ダッシュボードで確認できます。データベースの現在および過去のメトリクスを表示する手順は次のとおりです。
-
Cloudflare ダッシュボードで、D1 ページに移動します。
D1 SQL database を開く ↗ -
既存の D1 データベースを選択します。
-
Metrics タブを選択します。
必要に応じて、クエリする時間範囲を選べます。デフォルトは直近 24 時間です。
GraphQL Analytics API を使って、D1 データベースの分析をプログラムからクエリできます。この API は Cloudflare ダッシュボードと同じデータセットを参照し、GraphQL の イントロスペクション にも対応しています。
D1 の GraphQL データセットには、Cloudflare アカウント ID を指定する accountTag フィルターが必要です。含まれるデータセットは次のとおりです。
d1AnalyticsAdaptiveGroupsd1StorageAdaptiveGroupsd1QueriesAdaptiveGroups
指定した $databaseId について readQueries と writeQueries の合計を、databaseId と date でグループ化してクエリします。
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
}
}
}
}
}アカウント全体の readQueries と writeQueries をクエリします。
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
}
}
}
}
}D1 は、クエリ性能の把握とデバッグに使えるメトリクスを提供します。GraphQL の d1QueriesAdaptiveGroups、または wrangler d1 insights コマンドからアクセスできます。
D1 はクエリ文字列を記録するため、実行ごとのメトリクスを分析しやすくなっています。機密情報を除くため、バインドパラメーター は記録しません。
| オプション | 説明 |
|---|---|
--timePeriod |
現在から指定した期間までのデータを取得します(デフォルト: 1d)。 |
--sort-type |
insights の並び替えに使う演算です。sum または avg を選びます(デフォルト: sum)。 |
--sort-by |
insights の並び替えに使うフィールドです。time、reads、writes、count から選びます(デフォルト: 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
}
]