D1 提供数据库分析功能,允许您检查账户中所有和/或每个数据库的查询量、查询延迟和存储大小。
Cloudflare 仪表板 ↗ 图表中显示的指标从 Cloudflare 的 GraphQL Analytics API 查询。您可以通过 GraphQL 或 HTTP 客户端以编程方式访问这些指标。
D1 目前导出以下指标:
| 指标 | GraphQL 字段名 | 描述 |
|---|---|---|
| Read Queries (qps) | readQueries |
针对数据库发出的读取查询数量。这是原始读取查询数量,不用于计费。 |
| Write Queries (qps) | writeQueries |
针对数据库发出的写入查询数量。这是原始写入查询数量,不用于计费。 |
| Rows read (count) | rowsRead |
查询中读取(扫描)的行数。有关行计数方式的更多详情,请参阅定价。 |
| Rows written (count) | rowsWritten |
查询中写入的行数。 |
| Query Response (bytes) | queryBatchResponseBytes |
序列化查询响应的总响应大小,包括所有/任何列名、行和元数据。以字节为单位报告。 |
| Query Latency (ms) | queryBatchTimeMs |
服务器端总查询响应时间,包括响应序列化。以毫秒为单位报告。 |
| Storage (Bytes) | databaseSizeBytes |
数据库的最大大小。以字节为单位报告。 |
指标可查询(并保留)过去 31 天的数据。
D1 通过 Workers Binding API 为每个独立查询返回读取行数、写入行数(或两者)。
行计数是对该查询读取(扫描)或写入的行数的精确计数。 检查行计数以了解给定查询的性能和成本,包括是否可以通过使用索引减少读取行数。使用查询计数了解数据库的总流量,并判断哪些数据库处于活跃使用状态。
有关行计数方式的更多详情,请参阅定价文档。
D1 的每个数据库分析可在 Cloudflare 仪表板中查看。要查看数据库的当前和历史指标:
-
在 Cloudflare 仪表板中,前往 D1 页面。
Go to 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
}
]