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