You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
driver-turso: remote mode never materializes object-level indexes — every declared secondary index is absent on production Turso tenant databases, so hot polling queries full-scan #17609
EXPLAIN QUERY PLAN SELECT id FROM sys_notification_delivery
WHERE status ='pending'AND partition_key = ? AND next_attempt_at <= ?
ORDER BY next_attempt_at LIMIT50
远程租户库 → SCAN sys_notification_delivery
USE TEMP B-TREE FOR ORDER BY
本地 → SEARCH sys_notification_delivery USING INDEX idx_sys_notification_delivery_b3081700
(status=? AND partition_key=? AND next_attempt_at<?)
原因(读码;origin/main3ef96b471 仍如此,无在途 PR)
remote 模式下 TursoDriver.initObjects 走 RemoteTransport.syncSchemasBatch。remote-transport.ts 里所有索引 DDL 都来自 buildUniqueIndexDDL(:2160,由 uniqueIndexesFromFields 生成——只看字段级unique),发射点 :1841 / :1868 / :1941 / :1981,全文件唯一一条 DDL 模板是 :2196 的 CREATE UNIQUE INDEX IF NOT EXISTS。
现象(生产实测;租户信息已匿名)
两个生产租户库(
driver-tursoremote 模式,libsql://)的sqlite_master:unique生成的uniq_*+ 2 个 metadata-protocol 原生 SQL 建的idx_sys_metadata_overlay_*uniq_*sys_notification_delivery声明了 5 个索引(含 1 个对象级unique)→ 两个库里一个都没有,只有sqlite_autoindex_sys_notification_delivery_1sys_job_queue声明了 3 个 → 两个库里一个都没有SqlDriver(better-sqlite3)落地后:sys_notification_delivery6 个、sys_job_queue4 个,齐全同一条领取查询的执行计划:
原因(读码;
origin/main3ef96b471仍如此,无在途 PR)remote 模式下
TursoDriver.initObjects走RemoteTransport.syncSchemasBatch。remote-transport.ts里所有索引 DDL 都来自buildUniqueIndexDDL(:2160,由uniqueIndexesFromFields生成——只看字段级unique),发射点:1841/:1868/:1941/:1981,全文件唯一一条 DDL 模板是:2196的CREATE UNIQUE INDEX IF NOT EXISTS。对象级
indexes: [...]——无论是否unique——在 remote 路径上没有任何消费者。本地的对应物是SqlDriver.syncDeclaredIndexes(sql-driver.ts:9812)。#16570 修的是
indexes进initObjects参数的类型面;turso-driver.ts那段注释自己也写了「the runtime carried both keys the whole time」——但带着键不等于把它渲染成 DDL。这是 ADR-0049「声明无执行点」在 DDL 层的一例:从外面看什么都没坏,代价只出现在账单上。后果(生产实测)
一个租户库 9 天 1,011.6 亿次行读,占其所在 Turso 组织的 99.9%,已进入超额计费;该库数据总量 12.7 MB。
机制是三件事叠乘(另两件分卡):
service-messaging另卡)service-messaging另卡)实测稳态约每秒 28 次全表扫描
sys_notification_delivery;表每天 +316 行,日读量每天线性 +8 亿。验收
SqlDriver.syncDeclaredIndexes同名同键(buildIndexName)。新表随建表批次一起落;已有表走 retrofit(IF NOT EXISTS,零改数据)error级报出原因(与 drivers(turso): the remote face dropsuniqueentirely — a declared-unique column takes duplicates, and an upsert onconflictKeysdies with a raw SqliteError #8413 的 unique retrofit 同等待遇)SqlDriver与 remote transport 落地,比较sqlite_master的索引名集合全等;至少覆盖sys_notification_delivery、sys_job_queueEXPLAIN QUERY PLAN为SEARCH … USING INDEX影响面
所有 remote 模式租户库(托管云的每个环境)。修复发布并被消费方 pin 后,已有库靠 retrofit 在下一次 kernel 构建时补齐。