SQLite 開發團隊于 2024 年 10 月 21 日發布了 SQLite 3.47.0 版本,我們來了解一下新版本的改進功能。
觸發器增強
SQLite 3.47.0 版本開始,觸發器函數 RAISE() 的 error-message 參數可以支持任意 SQL 表達式。在此之前,該參數只能是字符串常量。
?
新版本的函數可以輸出更加靈活有用的錯誤信息。
JSON運算符
新版本的 JSON 運算符 ->> 支持從數組右側開始計算元素下標,例如:
sqlite> select '[1,2,3,4]' ->> 1;
2
sqlite> select '[1,2,3,4]' ->> -1;
4
當表達式右側參數為負數時,表示從右側開始開始計算元素位置。
SQL函數
新版本改進了聚合函數 group_concat(),當輸入參數只有一行空字符串時返回空字符串而不是 NULL。
sqlite> CREATE TABLE t(cid int, val varchar(10));
sqlite>
sqlite> INSERT INTO t values(1, 'S'),(1, 'Q'),(1, 'L');
sqlite> INSERT INTO t values(2, '');
sqlite> INSERT INTO t values(3, null);
sqlite>
sqlite> .nullvalue 'None'
sqlite> SELECT group_concat(val)
...> FROM t
...> GROUP BY cid;
S,Q,L
None
新版本增強了表值函數 generate_series(),可以識別并且使用基于返回結果值的約束。
性能優化
SQLite 3.47.0 性能優化包括:
優化了 IN 運算符中的子查詢重用,尤其是存在謂詞下推導致的 IN 運算符重用。
針對 IN 運算符中的子查詢,在可能帶來優化性能的場景時使用布隆過濾器。
對于類似“SELECT func(a) FROM tab GROUP BY 1”的查詢,確保每行數據只調用一次 func() 函數。
如果已知某個字段的選擇性很低(通過分析該字段參與的其他索引獲得),基于該字段的查詢不會嘗試創建自動索引(查詢時索引)。
針對涉及大量維度表的星型查詢優化了查詢計劃。
增加了排序子查詢(order-by-subquery)優化功能,當查詢最終的排序結果和子查詢中的 ORDER BY 結果一致時,可以避免最終的排序操作。
針對表達式索引,如果查詢計劃器可以確認不會使用表達式的子類型,indexed-subtype-expr 優化就會盡量使用作為索引一部分的表達式的數值,而不會基于表中的數據重新計算表達式。
其他優化運行速度的代碼調整。
命令行工具
SQLite 3.47.0 增加了一個試驗性質的命令行工具 sqlite3_rsync,它可以用于實現 SQLite 主從復制。顯然這是一個非常重要的功能,可以完成 SQLite 原生一致性復制,期待正式版本。
命令行工具默認增加了擴展聚合/窗口函數 median()、percentile()、percentile_cont() 以及 percentile_disc()。
命令行工具增加了一個元命令 .www,它等價于“.once -w”,可以將查詢結果以 HTML 表格形式在瀏覽器中顯示。
sqlite3_analyzer 工具可以獲取 WITHOUT ROWID 數據表的詳細統計信息。
當數據庫比較工具 sqldiff 第二個參數指定的數據庫不存在時,不再創建一個空白數據庫。
其他改進
修復了非主流 unix-dotfile VFS 回滾熱日志文件時存在的一個問題。
即使使用了沒有注冊的非標準分詞器,也可以刪除 FTS5 數據表。
通過 ALTER TABLE ADD COLUMN 語句新增非空且存在默認值的字段時,可以識別更新前的鉤子程序。
增強了 sqlite_dbpage 虛擬表,INSERT 語句可以用于增加或者減少數據庫文件大小。
SQLite 不在使用 long double 數據類型,因為支持該類型的硬件越來越少,而且一些編譯工具鏈無法支持。
新版本支持的 TCL 接口升級為 TCL 9。雖然 TCL 8.5 以及更高版本可能正常工作,但是不能保證,建議升級到 TCL9。
新版本還修復了 JavaScript/WASM 相關的一些問題。同時還改進了 FTS5 相關功能。
完整的發行說明可以參考官方文檔:
https://www.sqlite.org/releaselog/3_47_0.html
該文章在 2024/10/24 9:25:11 編輯過