| layout | default |
|---|---|
| title | SQL 参考 |
| description | 当前版本真实支持的数据面与控制面 SQL 语法、限制和示例。 |
| permalink | /sql-reference/ |
想直接复制完整场景化示例,可先看 [SQL Cookbook]({{ '/sql-cookbook/' | relative_url }});本页更偏向能力边界与精确语法说明。
定义关系表 schema。关系表 MVP 使用 KV-backed rowstore 存放在数据库目录的 tables/ 下,不修改时序 .SDBWAL / .SDBSEG 格式。
CREATE TABLE devices (
id INT NOT NULL,
site_id INT NULL,
name STRING NOT NULL,
enabled BOOL,
version INT ROWVERSION,
installed_at DATETIME NULL,
metadata JSON NULL,
payload BLOB NULL,
PRIMARY KEY (id),
FOREIGN KEY (site_id) REFERENCES sites (id)
)规则:
- 当前必须声明
PRIMARY KEY (...);主键列会强制为NOT NULL。 - 支持类型:
INT、FLOAT、BOOL、STRING、DATETIME、BLOB、JSON。 DATETIME可写 Unix 毫秒整数或 ISO-8601 字符串,查询时返回 UTCDateTime。BLOB可写 base64 字符串;ADO.NET 参数可直接传byte[]。JSON当前按 UTF-8 字符串存储;可用json_value(json_col, '$.path')做 path 投影和过滤。- 二级索引使用
CREATE INDEX单独声明。 FOREIGN KEY (...) REFERENCES parent (...)第一版只支持表级声明,引用列必须等于被引用表PRIMARY KEY;外键列任一为NULL时跳过校验。ROWVERSION只能声明在一个INT列上;INSERT自动写入1,UPDATE自动递增,可用WHERE id = ... AND version = ...获得乐观并发冲突检测。
关系表支持普通二级索引和唯一索引。索引声明随 table schema 持久化,索引内容从 rowstore 派生,打开表或 schema 变更时可重建。
CREATE INDEX idx_devices_tenant ON devices (tenant);
CREATE UNIQUE INDEX ux_devices_serial ON devices (serial);
CREATE INDEX IF NOT EXISTS idx_devices_site ON devices (site, name);
DROP INDEX idx_devices_site ON devices;当前行为:
- 索引名在单表内唯一。
- 索引列必须存在,可包含 1 个或多个列。
- 唯一索引会在
INSERT/UPDATE/ 轻事务提交时校验现有数据和同批数据冲突。 SELECT/UPDATE/DELETE的WHERE覆盖索引全部列的等值条件时,可先走二级索引候选行,再执行完整 WHERE 过滤。- 索引内容不作为第二份权威数据保存;rowstore 是主数据,索引可重建。
INSERT INTO devices (id, name, enabled)
VALUES (1, 'pump-01', TRUE), (2, 'fan-02', FALSE);
SELECT id, name
FROM devices
WHERE enabled = TRUE AND id > 1
ORDER BY id DESC
LIMIT 10;
UPDATE devices
SET name = 'pump-01b'
WHERE id = 1;
DELETE FROM devices
WHERE id = 2;当前行为:
INSERT按主键插入;主键已存在时返回错误,不会静默覆盖。UPDATE支持更新非主键列;当前不支持更新主键列。SELECT支持*、列投影、字面量投影、WHERE中的AND/OR/NOT、基础比较和简单数值运算。- 关系表
JSON列支持json_value(metadata, '$.site')这类 path 表达式;对象或数组结果会以紧凑 JSON 字符串返回。 WHERE覆盖完整主键等值条件时会走主键读取;覆盖完整二级索引等值条件时会走二级索引候选行;其它条件走表扫描后过滤。ORDER BY支持结果集中的任意列名;LIMIT/OFFSET/FETCH语法与 measurement 查询一致。
SqlExecutor.ExecuteScript(...) 和服务端 /sql/batch 支持关系表小批量 DML 轻事务:
BEGIN;
INSERT INTO devices (id, name, enabled) VALUES (3, 'valve-03', TRUE);
UPDATE devices SET enabled = FALSE WHERE id = 1;
DELETE FROM devices WHERE id = 2;
COMMIT;也可以显式写 BEGIN TRANSACTION;ROLLBACK 会放弃当前轻事务中排队的变更。
当前边界:
- 轻事务支持同一数据库内多个关系表的
INSERT/UPDATE/DELETE原子提交与回滚。 - 不支持嵌套事务、measurement / document 写入事务、DDL 事务或跨数据库事务。
COMMIT前会校验 NOT NULL、主键、唯一索引、外键和 ROWVERSION 乐观并发列;任一失败时,不会留下已应用的 rowstore / index 变更。- 稳定约束错误码:
table_unique_violation、table_foreign_key_violation、table_concurrency_conflict。 - 隔离级别边界:ADO.NET 仅接受默认 /
ReadCommitted轻事务;当前语义是单连接排队、提交时获取表管理器锁并一次性校验/应用,不提供 MVCC、可重复读、序列化隔离或跨进程长事务。
MM4 第一版支持把 measurement 与一个关系表做内连接,用设备、资产、租户、站点等维表补充时序结果:
SELECT t.time, d.name, d.site, t.value
FROM temperature AS t
JOIN devices AS d ON t.device_id = d.id
WHERE d.tenant = 'tenant-1'
AND t.time >= 1713676800000
ORDER BY t.time DESC
LIMIT 100;当前行为:
- 支持
JOIN/INNER JOIN,语义为 inner join。 - JOIN 左侧必须是 measurement,右侧必须是关系表。
ON当前仅支持一个等值条件,且 measurement 侧连接键必须是TAG列;关系表侧可连接主键列或普通列。- measurement 侧
tag = '...'和time范围过滤会先下推到时序查询;关系表侧WHERE条件会先用主键或二级索引候选行,再做完整过滤。 - 输出投影支持
time、measurement tag / field、table 列和字面量;有歧义的列名必须使用alias.column。 ORDER BY可引用 JOIN 结果中的 measurement 或 table 列,并在分页前执行。EXPLAIN支持 JOIN 查询,access_path会显示 measurement 与 table 双侧下推路径,例如measurement:tag_index;table:secondary_index;join:hash。
当前限制:
- 不支持
LEFT JOIN/RIGHT JOIN/FULL JOIN。 - 不支持 measurement 与 measurement JOIN、table 与 table JOIN、多表 JOIN、子查询 JOIN。
- JOIN 查询暂不支持聚合、
GROUP BY、窗口函数或标量函数投影。
MM5 第一版支持 JSON 文档集合作为一等数据模型。集合主数据存放在数据库目录的 documents/ 下,使用 KV-backed 存储、独立 schema 文件和可重建 JSON path 索引;不修改时序 .SDBWAL / .SDBSEG 格式。
CREATE DOCUMENT COLLECTION device_docs;
INSERT INTO device_docs (id, document)
VALUES
('dev-1', '{"type":"pump","site":"north","metrics":{"temp":21.5}}'),
('dev-2', '{"type":"fan","site":"south","metrics":{"temp":18}}');
SELECT id,
json_value(document, '$.type') AS type,
json_value(document, '$.metrics.temp') AS temp
FROM device_docs
WHERE json_value(document, '$.site') = 'north';
UPDATE device_docs
SET document = '{"type":"pump","site":"north","metrics":{"temp":22}}'
WHERE id = 'dev-1';
DELETE FROM device_docs
WHERE id = 'dev-2';元数据与索引:
SHOW DOCUMENT COLLECTIONS;
DESCRIBE DOCUMENT COLLECTION device_docs;
CREATE JSON INDEX idx_device_type ON device_docs ('$.type');
SHOW JSON INDEXES ON device_docs;
DROP JSON INDEX idx_device_type ON device_docs;
DROP DOCUMENT COLLECTION device_docs;当前行为:
- 文档集合固定暴露
id和document/json两个伪列;SELECT *展开为id, document。 INSERT需要提供id与document或json,JSON 文本会用System.Text.Json校验并规范化为紧凑 JSON。UPDATE当前仅支持SET document = '<json>',按命中文档整体替换。json_value(document, '$.path')支持$、点属性、$['property']和数组下标,例如$.metrics.temp、$['display-name']、$.tags[0]。CREATE JSON INDEX建立基础 path 等值索引;WHERE json_value(document, '$.type') = 'pump'可走该索引,EXPLAIN的access_path会显示json_path_index。id = '...'会走文档 ID 读取;其它条件走集合扫描后过滤。- 第一版不提供 MongoDB 兼容 API、跨文档复杂事务或 JSON schema 校验。
MM5 第二批支持把本地 JSON 文件作为只读虚拟表查询,或导入到 document collection / 关系表。JSON 文件能力用于临时查询、迁移和批量导入;导入完成后的主数据仍由 SonnetDB 的 document collection 或 table 托管。
SELECT id,
json_value(document, '$.site') AS site
FROM json_each('/data/devices.json', 'array', '$.id')
WHERE json_value(document, '$.enabled') = TRUE;
EXPLAIN SELECT id FROM json_each('/data/devices.ndjson', 'lines');json_each(...) 和兼容别名 json_table(...) 暴露三列:
ordinal:文件内从 0 开始的行号。id:默认读取$.id;也可用第 3 个参数指定 ID path;缺失时使用ordinal。document:规范化后的紧凑 JSON 文本。
导入语法:
CREATE DOCUMENT COLLECTION device_docs;
IMPORT JSON '/data/devices.ndjson'
INTO device_docs
FORMAT LINES
ID PATH '$.device.id';
CREATE TABLE devices (
id INT,
name STRING,
metadata JSON,
PRIMARY KEY (id)
);
IMPORT JSON '/data/devices.json'
INTO devices
FORMAT ARRAY;当前行为:
- 格式支持
AUTO、ARRAY和LINES;AUTO会识别顶层数组 / 单对象 / JSON Lines。 - 导入 document collection 时每条记录整体写入
document,ID 来自ID PATH、默认$.id或ordinal。 - 导入 table 时要求每条记录是对象,并按列名映射到表列;对象 / 数组可写入
JSON列。 - JSON 文件虚拟表不维护索引;
EXPLAIN的access_path显示json_file_virtual_table。
关系表 JSON 列也支持基础 path 等值索引:
CREATE TABLE devices (
id INT,
metadata JSON,
PRIMARY KEY (id)
);
CREATE JSON INDEX idx_devices_site
ON devices (metadata, '$.site');
SELECT id
FROM devices
WHERE json_value(metadata, '$.site') = 'north';当前行为:
- 关系表 JSON path 索引只能引用一个
JSON列和一个 JSON path。 - 仅支持
json_value(json_col, '$.path') = literal形式的等值下推;其它谓词仍会扫描过滤。 - path 缺失或结果为
null的行不写入 path 索引。 SHOW INDEXES ON <table>的columns会显示为json_col->$.path;EXPLAIN的access_path会显示json_path_index。
MM6 第一批把 DotSearch 接入 JSON 文档集合,全文索引是从 document collection 主数据派生出的可重建索引。当前实现的索引目录由 SonnetDB 托管在 documents/fulltext/ 下,主数据仍以文档集合为准。
CREATE FULLTEXT INDEX ft_logs_message
ON logs ('$.message')
USING unicode;
SHOW FULLTEXT INDEXES ON logs;
DROP FULLTEXT INDEX ft_logs_message ON logs;字段和分词器:
- 字段可写
document/json,表示索引整份 JSON;也可写字符串 JSON path,例如'$.message'、'$.title'。 - 支持分词器:
unicode、cjk、jieba。不写USING时默认unicode。 - 同一个全文索引可包含多个字段,搜索时可指定某个字段,或用
*搜索该索引内全部字段。
查询示例:
SELECT id, bm25_score() AS score
FROM logs
WHERE match(ft_logs_message, '$.message', 'pump alarm', 20)
ORDER BY score DESC
LIMIT 20;
SELECT id
FROM logs
WHERE match(ft_logs_all, *, 'pump', 20);当前行为:
match(index_name, field, query[, topK])必须作为WHERE中独立的AND谓词使用;当前一个查询只支持一个全文谓词。topK省略时默认取 100;带分页时会按OFFSET + FETCH/LIMIT预取候选,再执行完整 WHERE、排序和分页。bm25_score()只能在包含match(...)的文档集合查询中用于投影或排序,返回 DotSearch 的 BM25 相关性分数。INSERT/UPDATE/DELETE会同步维护全文索引;索引目录缺失时会从 document collection 主数据重建。EXPLAIN SELECT ... WHERE match(...)的access_path会显示fulltext_index,index_name会显示命中的全文索引名。
MM8 第一批支持在 document collection 上用全文 BM25 与 JSON embedding 数组做融合排序。文档主数据仍归 document collection 管理;全文索引由 DotSearch 派生维护,JSON 向量字段按查询时计算距离。
SELECT id,
bm25_score() AS text_score,
vector_distance() AS distance,
hybrid_score() AS score
FROM hybrid_search(
source => logs,
text_index => ft_logs_message,
text_field => '$.message',
text => 'pump alarm',
vector_field => '$.embedding',
vector => [1, 0, 0],
k => 20,
text_weight => 0.6,
vector_weight => 0.4
)
WHERE site = 'north'
ORDER BY score DESC;也可以在 measurement KNN + 知识文档融合结果上连接一个关系维表。Planner 会先把 d.tenant = ... 下推给关系表索引,再用命中的 d.id 收窄 measurement measurement_join_tag 的候选 series:
SELECT measurement.device_id AS device,
d.site AS site,
document_id,
hybrid_score() AS score
FROM hybrid_search(
source => incidents,
documents => knowledge,
vector_field => embedding,
vector => [1, 0, 0],
measurement_join_tag => device_id,
document_join_path => '$.device_id',
text => 'pump alarm'
)
JOIN devices d ON measurement.device_id = d.id
WHERE d.tenant = 'tenant-1'
AND measurement.time >= 1713676800000
AND category = 'fault'
ORDER BY score DESC;当前行为:
source必须是 document collection;text_index可省略但集合中必须只有一个全文索引。text是全文查询文本,vector是查询向量;vector_field默认$.embedding,目标 JSON 值必须是 number array。text_field默认*,可指定全文索引中的 JSON path 字段。metric可选,支持'cosine'、'l2'、'inner_product';默认'cosine'。hybrid_score = text_weight * normalized_bm25 + vector_weight * vector_score;不写权重时两者各占 0.5。- 结果伪列支持
bm25_score()、vector_distance()、vector_score()、hybrid_score(),也可直接投影id、document/json和 JSON 顶层字段名。 WHERE支持对结果伪列或 JSON 顶层字段做基础比较,例如site = 'north';复杂文档过滤可用json_value(document, '$.path')。EXPLAIN的access_path会显示hybrid_search,index_name显示使用的全文索引。- document collection 内融合只读取 document collection 主数据和派生全文索引,不会把文档主数据交给 DotSearch 或 DotVector。
MM8 第二批支持以 measurement 的 VECTOR 字段做 KNN 召回,再通过 measurement tag 与 document collection JSON path 关联知识条目,并可叠加知识文档全文 BM25 与可选知识向量评分:
SELECT measurement.device_id AS device,
document_id,
json_value(document, '$.title') AS title,
measurement_distance() AS m_distance,
bm25_score() AS text_score,
hybrid_score() AS score
FROM hybrid_search(
source => incidents,
documents => knowledge,
vector_field => embedding,
vector => [1, 0, 0],
k => 20,
measurement_join_tag => device_id,
document_join_path => '$.device_id',
document_join_index => idx_knowledge_device,
text_index => ft_knowledge_body,
text_field => '$.body',
text => 'pump alarm overheating',
measurement_weight => 0.7,
text_weight => 0.3
)
WHERE time >= 1713676800000 AND category = 'fault'
ORDER BY score DESC;当前行为:
source是带VECTOR字段的 measurement;documents是关联的 document collection。vector_field默认embedding,也可写measurement_vector_field;vector必须与该列维度一致。measurement_join_tag/join_tag指定 measurement TAG,document_join_path指定知识文档 JSON path;若有同 path 的 JSON index 或显式document_join_index,关联会优先走索引。text可选;提供时会用text_index/text_field读取知识文档全文 BM25。未提供text时仅做 measurement KNN + 关联文档融合。document_vector_field可选;提供时会对知识文档中的 JSON number array 再计算一次向量分数。- 结果伪列支持
measurement_distance()、measurement_score()、bm25_score()、text_score()、document_vector_distance()、document_vector_score()和hybrid_score();vector_distance()/vector_score()在该模式下兼容指向 measurement KNN 分数。 WHERE中 measurementtime/ tag 谓词会下推给 KNN;关系维表谓词会先走主键 / 二级索引候选行并收窄 measurement join tag;剩余谓词可过滤知识文档顶层字段、json_value(document, '$.path')或融合分数。EXPLAIN的access_path会显示hybrid_search_measurement_knn_documents;带关系维表过滤时会追加relation_filter:<table_access_path>。
定义 measurement schema:
CREATE MEASUREMENT cpu (
host TAG,
region TAG STRING,
usage FIELD FLOAT NULL,
count FIELD INT,
ok FIELD BOOL,
label FIELD STRING NOT NULL
)规则:
TAG列默认为字符串,TAG和TAG STRING等价。FIELD列支持FLOAT、INT、BOOL、STRING、VECTOR(N)、GEOPOINT。- schema 中至少要有一个
FIELD列。 time不属于 schema 定义的一部分。NULL/NOT NULL可作为 DDL 兼容修饰符出现在列类型后;当前仅保留在 SQL AST 中,执行层不把它持久化为 catalog 约束,也不强制NOT NULL。DEFAULT <expr>目前会被 parser 接受,但执行CREATE MEASUREMENT时会返回明确的DEFAULT暂不支持错误。
稀疏字段语义:
- SonnetDB 的 field 是稀疏的:同一个 measurement 的不同时间点可以携带不同 field 集合。
- 如果某个时间点没有写入某个 field,查询该列时结果为
NULL;这表示“该时间点未记录该字段”,不是 schema 约束失败。 - 写入时不要用
DEFAULT或显式NULL表达缺值;请省略该 field,或在应用侧写入具体默认值。
INSERT INTO cpu (time, host, region, usage, count, ok, label)
VALUES
(1713676800000, 'server-01', 'cn-hz', 0.71, 10, TRUE, 'ok'),
(1713676860000, 'server-01', 'cn-hz', 0.73, 11, TRUE, 'ok')规则:
time是保留伪列,表示 Unix 毫秒时间戳。time省略时会使用当前 UTC 毫秒时间。- 每一行至少需要提供一个
FIELD列值。 TAG列必须是字符串字面量。FIELD FLOAT可以接受整数或浮点字面量。- 目标 measurement 不存在时,
INSERT会按列值自动创建 schema;已有 measurement 缺失列时也会自动补齐。 - SQL
INSERT的未知字符串列会推断为TAG,未知非字符串列会推断为FIELD。 - 已有
INT字段遇到浮点值时会提升为FLOAT;已有FLOAT字段接收整数时会转换为浮点保存,不会降级为INT。 NULL不能作为当前INSERT的显式列值;要表达某个 field 在该时间点缺失,请从列列表中省略它。
查询所有列:
SELECT * FROM cpu WHERE host = 'server-01'显式投影:
SELECT time, host, usage
FROM cpu
WHERE host = 'server-01' AND time >= 1713676800000 AND time < 1713677400000
ORDER BY time ASC标量函数投影:
SELECT abs(-usage), round(usage / 3, 2), sqrt(count), log(count, 10), coalesce(label, 'n/a')
FROM cpu
WHERE host = 'server-01'单表别名与限定列名:
SELECT c.time, c.host, c."usage"
FROM cpu AS c
WHERE c.host = 'server-01'
ORDER BY c.time DESC
LIMIT 10兼容常见探活查询的字面量投影:
SELECT 1 AS ok FROM cpu LIMIT 1当前行为:
SELECT *会展开为time + 所有 tag 列 + 所有 field 列。- 支持字面量投影(如
SELECT 1 ... LIMIT 1),会按匹配到的时间轴返回常量列。 - 当某个时间点缺少某个 field 时,结果列会返回
NULL。 - 标量函数当前支持
abs、round、sqrt、log、coalesce。 - 标量函数当前仅支持出现在
SELECT投影中,可嵌套,也可接收算术表达式参数。 - 支持
FROM measurement [AS] alias单表别名,以及alias.column/alias."Column"限定列名;执行前会校验限定符必须匹配当前别名。 coalesce(...)只会在当前结果行存在时参与求值;它不会额外扩展原始查询的时间轴。- 结果按时间升序返回。
分页子句(兼容两种风格):
-- SQL 标准风格
SELECT time, host, usage
FROM cpu
WHERE host = 'server-01'
ORDER BY time ASC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- MySQL/PostgreSQL 常见风格
SELECT time, host, usage
FROM cpu
WHERE host = 'server-01'
ORDER BY time DESC
LIMIT 10 OFFSET 20;说明:
- 支持
ORDER BY time [ASC|DESC],排序会在分页前应用;当前要求查询结果中包含time列。 - 支持
OFFSET n(仅跳过,不限制返回行数)。 - 支持
FETCH FIRST|NEXT n ROW|ROWS ONLY。 - 支持
LIMIT n [OFFSET m]兼容语法。 ORDER BY/OFFSET/FETCH/LIMIT作用在最终结果集(投影/聚合之后)。
支持的聚合函数:
countsumminmaxavgfirstlast
示例:
SELECT sum(usage), avg(usage), min(usage), max(usage)
FROM cpu
WHERE host = 'server-01'count(*) 与 SQL 兼容写法 count(1) 也受支持:
SELECT count(*) FROM cpu WHERE host = 'server-01'
SELECT count(1) FROM cpu WHERE host = 'server-01'按时间桶聚合:
SELECT avg(usage) AS mean, count(usage)
FROM cpu
WHERE host = 'server-01'
GROUP BY time(1m)当前限制和真实行为:
- 仅支持
GROUP BY time(duration)。 - 仅可用于聚合查询。
- 不支持
GROUP BY host这类按列分组。 - 结果当前只返回聚合列,不会自动带出桶起始时间列。
- duration 例子:
1000ms、30s、1m。
DELETE FROM cpu
WHERE host = 'server-01' AND time >= 1713676800000 AND time <= 1713677400000也可以只按 tag 或只按时间范围删除:
DELETE FROM cpu WHERE host = 'server-01'
DELETE FROM cpu WHERE time >= 1713676800000 AND time <= 1713677400000当前删除语义:
- 删除底层通过 tombstone 实现,不会原地改写旧 segment。
- 后续查询会过滤 tombstone 覆盖的点。
- compaction 会逐步消化已删除数据。
常见保留策略也可以直接写成相对时间:
DELETE FROM cpu
WHERE time >= now() - 30d虽然解析器支持更多表达式形态,但当前执行器的稳定支持范围是:
- tag 等值条件,例如
host = 'server-01' time的范围比较,例如time >= 1713676800000 AND time < 1713763200000,或者time >= now() - 1d AND time < now() + 1d- 多个条件使用
AND连接
当前不建议在生产示例中使用:
OR- tag 不等式
- field 条件过滤,例如
usage > 0 - 混合聚合列与普通列,例如
SELECT host, sum(usage) ...
这些写法中的不少在当前版本会直接报错。
SHOW MEASUREMENTS 列出当前数据库中所有时序 measurement,SHOW TABLES 列出当前数据库中所有关系表。两者都按字典序升序返回单列 name。
SHOW MEASUREMENTS;
SHOW TABLES;| name |
|---|
| cpu |
| mem |
列出指定关系表的二级索引:
SHOW INDEXES ON devices;| 列 | 类型 | 说明 |
|---|---|---|
index_name |
string | 索引名 |
is_unique |
bool | 是否唯一索引 |
columns |
string | 逗号分隔的索引列 |
created_utc |
string | UTC ISO-8601 创建时间 |
描述指定关系表的列结构,按 CREATE TABLE 声明顺序返回:
| 列 | 类型 | 说明 |
|---|---|---|
column_name |
string | 列名 |
data_type |
string | int64 / float64 / boolean / string / datetime / blob / json |
is_nullable |
bool | 是否允许 NULL |
is_primary_key |
bool | 是否属于主键 |
ordinal |
int64 | 声明顺序 |
DESCRIBE TABLE devices;描述指定 measurement 的列结构,按 CREATE MEASUREMENT 声明顺序返回三列:
| 列 | 类型 | 说明 |
|---|---|---|
column_name |
string | 列名 |
column_type |
string | tag 或 field |
data_type |
string | float64 / int64 / boolean / string |
关键字 MEASUREMENT 可省略,DESC 是 DESCRIBE 的兼容别名。
DESCRIBE MEASUREMENT cpu;
DESCRIBE cpu; -- 等价
DESC cpu; -- 等价| column_name | column_type | data_type |
|---|---|---|
| host | tag | string |
| usage | field | float64 |
若指定 measurement 不存在,会抛出 InvalidOperationException。
EXPLAIN 返回一组 key / value 结果行,用于估算查询会扫描的 series、segment、block 与行数。
EXPLAIN SELECT usage
FROM cpu
WHERE host = 'server-01' AND time >= now() - 1d;
EXPLAIN SHOW MEASUREMENTS;
EXPLAIN SHOW INDEXES ON devices;
EXPLAIN DESCRIBE MEASUREMENT cpu;当前支持范围:
SELECT ...SHOW MEASUREMENTS/SHOW TABLES/SHOW DOCUMENT COLLECTIONSSHOW INDEXES ON <table>/SHOW JSON INDEXES ON <collection>/SHOW FULLTEXT INDEXES ON <collection>DESCRIBE [MEASUREMENT] <name>/DESC <name>DESCRIBE TABLE <name>DESCRIBE DOCUMENT COLLECTION <name>
当前不支持对 INSERT、DELETE、CREATE、DROP、用户/授权/Token 控制面 SQL 做 EXPLAIN。
返回字段包括 database、statement_type、measurement、matched_series_count、estimated_segment_count、estimated_block_count、estimated_scanned_rows、estimated_memtable_rows、estimated_segment_rows、has_time_filter、tag_filter_count、access_path 与 index_name。关系表查询的 access_path 可能是 primary_key、secondary_index、json_path_index 或 table_scan;文档集合查询可能是 document_id、json_path_index、fulltext_index 或 document_scan;JSON 文件虚拟表会显示 json_file_virtual_table。
控制面 SQL 仅在服务端模式可用。
CREATE USER alice WITH PASSWORD 'pa$$'
CREATE USER admin2 WITH PASSWORD 'secret' SUPERUSER
ALTER USER alice WITH PASSWORD 'new-password'
DROP USER aliceCREATE DATABASE metrics
DROP DATABASE metrics
SHOW DATABASESGRANT READ ON DATABASE metrics TO alice
GRANT WRITE ON DATABASE metrics TO alice
GRANT ADMIN ON DATABASE * TO admin2
REVOKE ON DATABASE metrics FROM aliceSHOW USERS
SHOW GRANTS
SHOW GRANTS FOR alice
SHOW TOKENS
SHOW TOKENS FOR alice
ISSUE TOKEN FOR alice
REVOKE TOKEN 'tok_abcdef'说明:
SHOW TOKENS只返回 Token 元数据,不返回明文。ISSUE TOKEN FOR ...会在结果里一次性返回明文 Token。REVOKE TOKEN 'tok_xxx'按 token id 吊销。
| 端点 | 用途 |
|---|---|
POST /v1/db/{db}/sql |
单条 SQL,主要用于数据面;admin 也可通过它执行部分控制面语句 |
POST /v1/db/{db}/sql/batch |
批量 SQL 脚本 |
POST /v1/sql |
专用控制面 SQL 端点,仅 admin |
readonly:仅查询readwrite:可写入和查询admin:可管理数据库、执行控制面 SQL、进入完整管理能力
- [批量写入]({{ site.docs_baseurl | default: '/help' }}/bulk-ingest/)
- [ADO.NET 参考]({{ site.docs_baseurl | default: '/help' }}/ado-net/)
- [CLI 参考]({{ site.docs_baseurl | default: '/help' }}/cli-reference/)