QuestDB通过PostgreSQL协议插入的最后一行需新记录插入后才会在SELECT结果显示
QuestDB插入数据延迟可见问题解决方案
问题原因
- QuestDB为了优化高吞吐写入性能,对PostgreSQL协议的写入默认采用异步延迟提交策略:默认的SQL
COMMIT操作不会立即将内存中暂存的写入数据刷新为可读状态,会等写入数据积累到指定批量阈值、或者有新的写入请求触发、或者达到系统默认超时时间后才会自动刷新,单条小数据量插入时就会出现必须等下一条写入才能查到上一条的现象。 - 你当前使用的单条逐行插入模式刚好无法触达自动刷新的批量阈值,因此触发了延迟可见的问题。
解决方案
你可以根据自己的使用场景选择以下任意一种方案解决:
方案1:手动执行强制刷新提交
将代码中原有的标准conn.commit()替换为QuestDB特有的COMMIT AND FLUSH语句,该语句会强制立即将所有未提交的写入数据刷新为可读状态,修改示例如下:
# 替换原有conn.commit() cur.execute("COMMIT AND FLUSH")
该方案不需要修改全局配置,对其他业务写入无影响,适合大部分场景。
方案2:修改全局提交模式为同步
修改QuestDB配置文件中的pg.commit.mode参数,将默认值async改为sync,配置生效后所有通过PostgreSQL协议提交的事务都会默认同步刷新可读,不需要每次手动执行COMMIT AND FLUSH。
该方案会略微降低高吞吐批量写入的性能,适合你这种以单条小数据量写入为主的IoT场景。
方案3:改为批量写入
如果业务允许,建议攒多条数据后执行批量插入,既会自动触发数据刷新可读,写入性能也比单条逐行插入高3~10倍。
额外提示
你查询到的时间戳精度丢失(原数据带微秒,查询结果为整秒)是Python psycopg模块传递时间类型参数时的默认转换问题,可以将时间戳以字符串格式传递给QuestDB,即可保留完整时间精度。
内容的提问来源于stack exchange,提问作者Craggin Stylie
相关产品推荐
相关产品推荐

