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