Contents
pg_nanotime 發展規劃(Roadmap)
整理日期:2026-10-26(Asia/Taipei)。目前版本:0.3.0(2026-10-26 發布到 GitHub 與 PGXN;範圍型別與 TimescaleDB 一鍵設定)。
這份文件記錄「接下來要做什麼、為什麼這樣排、哪些決定不做」,讓之後接手的人(包括未來的自己)不必重新討論一次。每完成一項,就在清單上打勾,並同步更新 CHANGELOG.md 和 COVERAGE.md。
一、規劃原則
- 定位清楚,不過度設計。 pg_nanotime 處理的是「奈秒精度的時間點與固定長度的時間量」。月、年這類日曆單位交給 PostgreSQL 內建的
interval;和時間無關的功能另外開專案,不塞進這個擴充。 - 從日常需求出發。 先做使用者馬上用得到的功能,再做進階、少數人才需要的。每個新功能至少搭配一個貼近生活的案例教學,案例同時也是測試。
- 小步前進,向下相容。 新函式放進升級腳本(例如
pg_nanotime--0.2.0--0.3.0.sql),讓既有使用者用ALTER EXTENSION pg_nanotime UPDATE升級;CI 檢查「升級後」與「全新安裝」的物件完全一致。 - 不重複驗證。 已經在 COVERAGE.md 記錄為通過的功能不重測;只有程式碼變動時才跑 PG 17/18 完整測試,純文件變更由 CI 自動略過。
- 先確認現況,再決定要不要做。 動手前先查 PostgreSQL 新版本或其他擴充是否已經提供,避免重複造輪子。
二、已經具備、暫不擴充的部分
討論時想到的幾個點子,查過後發現 0.2.0 已經有了,記在這裡避免重複規劃:
| 功能 | 現況 |
|---|---|
| 奈秒分桶 | time_bucket_ns() 已支援三種時間型別 |
| 二進位傳輸 | 三種時間型別與 nanointerval 都有 send/recv |
| TimescaleDB 基本支援 | nanotime_part()、nanotime_part8()、ns()、nanotime_now_int8(),用法見 TIMESCALEDB.md |
| TAI 時鐘來源 | GUC nanotime.clock_source = tai 已實作 |
關於閏秒與 TAI 的決定
2022 年國際度量衡大會(CGPM)決議最晚在 2035 年前停止加入閏秒,而且 2017 年以後就沒有再加過。這代表 UTC 與 TAI 之後會固定相差 37 秒,TAI 的實用價值大幅下降。
決定: 保留現有的 nanotime.clock_source = tai(已實作,不移除以免破壞相容性),但不再投入閏秒處理或「實際 37 秒偏移」的驗證環境(chrony/ptp4l)。除非有使用者明確需要,否則維持現狀。
三、待辦清單
優先 1:時間範圍型別 nanotstzrange(目標 0.3.0)
為什麼: 「這段時間有沒有重疊」是非常普遍的需求,例如會議室、機台、GPU、直播時段不能重複預約。PostgreSQL 內建的 tstzrange 只到微秒,而高頻交易、量測、封包分析需要奈秒級的區間。
- [x] 用
CREATE TYPE ... AS RANGE定義nanotstzrange(以nanotimestamptz為子型別),並加上nanotsrange(nanotimestamp);8 bytes 版不做(nanotimestamptz8可隱含轉型後直接使用) - [x] 提供 subtype_diff 函式,讓 GiST 索引能有效率地估算(回傳秒,與
tstzrange_subdiff相同;沒有 canonical 函式,與tstzrange一樣是連續型) - [x] 確認內建的範圍運算子(
&&、@>、<@、-|-等)、range_agg、multirange 都能正常運作 - [x] GiST 索引與排他約束(
EXCLUDE USING gist (資源 WITH =, 時段 WITH &&)),搭配btree_gist - [x] 回歸測試
range(PG 17.11/18.6 通過),並更新 COVERAGE.md - [x] 案例教學一篇:「共用儀器預約不撞期」(案例 16)
- [x] 文件:TECHNICAL.md、GUIDE.md、EXAMPLES.md
範圍外: 不自訂新的範圍運算子;PostgreSQL 內建的範圍機制已經足夠。
優先 2:TimescaleDB 一鍵設定輔助函式(目標 0.3.0,已完成)
為什麼: 目前用 TimescaleDB 有兩個容易踩到的坑,寫在文件裡但仍然常被忽略:
1. 使用 partition_func 時,預設索引建在分區運算式上,查詢時間欄位需要自己再建 (ts DESC) 索引。
2. drop_chunks 的時間參數需要加 ::bigint。
- [x]
nanotime_timescale_setup(tbl regclass, col name, chunk nanointerval DEFAULT '1 day', migrate_data bool DEFAULT false):一次完成建立 hypertable(三種型別都用對應的分區函數)、set_integer_now_func與補上(ts DESC)索引(已有等效索引時沿用) - [x]
nanotime_drop_chunks(tbl, older_than nanotimestamptz, newer_than nanotimestamptz):免去手動轉型 - [x] 沒有安裝 TimescaleDB 時給出清楚的錯誤訊息(擴充本身不依賴 TimescaleDB,用動態 SQL 呼叫;回歸測試
timescale_missing) - [x] 測試(選用測試
timescale,TimescaleDB 2.31.0、PG 17.11/18.6 通過)與 TIMESCALEDB.md 更新;案例 7「工廠感測器」補上一鍵設定一節
之後再評估(有人需要再做)
| 點子 | 暫緩原因 |
|---|---|
| PTP/硬體時鐘來源 | 需要特定網卡與環境,使用者少 |
| ULID/UUIDv7 產生器 | PG 18 已內建 uuidv7(),要先確認還有什麼不足 |
| 查詢延遲直方圖 | 和時間型別無關,適合另開專案,可與 PG 監控工作結合 |
| 閏秒處理、TAI 實際偏移驗證 | 閏秒將停用,見上方的決定 |
四、每一項功能的完成標準
- 程式碼放在新版本的安裝腳本與升級腳本,CI 的升級與全新安裝一致性檢查通過。
- PG 17 與 PG 18 回歸測試全部通過。
- COVERAGE.md 在同一個 commit 更新(依 CONTRIBUTING.md 的規則)。
- 至少一篇案例教學,並更新 CHANGELOG.md。
- 發布時同步更新 GitHub Release 與 PGXN。