オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
2022.12.16 Friday
SQLite 最新版(2022-11-16 (3.40.0))の新機能: SQLite to WASM (1)
本エントリは SQLite Advent Calendar 2022の16日目です。
SQLite Release 3.40.0 On 2022-11-16
1.Add support for compiling SQLite to WASM and running it in web browsers. NB: The WASM build and its interfaces are considered "beta" and are subject to minor changes if the need arises. We anticipate finalizing the interface for the next release.
SQLiteをWASMにコンパイルし、Webブラウザーで実行するためのサポートを追加しました。
注意:WASMビルドとそのI/Fは「ベータ版」とみなされ、必要に応じてマイナーな変更が加えられる可能性があります。次のリリースでI/Fを完成させる予定です。
とうとうWASM対応ですか!
その前に、WASMって何?
WASMはWebAssemblyのことです。あんどうさんの以下の本(私は技術書展で買った記憶あり)や、
Qiitaの記事を読むとわかりますが、ブラウザ上で動作させるためのバイナリコードの新しいフォーマットのことです。
作って学ぶWebAssembly: TypeScriptとDenoで作るWasmランタイム (空想工学舎) Kindle版
WebAssemblyとは(Qiita)
# こういった本も参考になるかも
時代はRDB on WASM ?
ちょうど本日このようなツイートがありました。さっと仕様確認するには便利かも。
PostgreSQLをブラウザ上で実行するOSS「Postgres-WASM」を触ってみた
次回以降SQLite版も確認してみたいと思います。
2022.12.14 Wednesday
SQLiteのバックエンドでInnoDB?
SQLiteのバックエンドでInnoDB?
本エントリは SQLite Advent Calendar 2022の14日目です。
私は MySQL闇歴史2 というAdvent Calendarにも参加していて
その9日目のエントリにEmbedded InnoDBの話を書きました。
yoku0825さんが、Twitterでとりあげてくれたのですが、
そのツイートに対して、以前InnoDBの開発に携わっていたSunnyからリプライがありました。
もしかしたらSQLiteのバックエンドでInnoDBが動き
それが世の中に出る、といった未来もあったのかも知れません。チト残念。
2022.12.13 Tuesday
SQLite 最新版(2022-11-16 (3.40.0))の新機能: クエリプランナの拡張(b),(c)
SQLite 最新版(2022-11-16 (3.40.0))の新機能: クエリプランナの拡張(b),(c)
本エントリは SQLite Advent Calendar 2022の13日目です。
SQLite Release 3.40.0 On 2022-11-16
3.Query planner enhancements:
b.Recognize covering indexes on tables with more than 63 columns where columns beyond the 63rd column are used in the query and/or are referenced by the index.
Extract the values of expressions contained within expression indexes where practical, rather than recomputing the expression.
んー、わからん(笑)
c.The NOT NULL and IS NULL operators (and their equivalents) avoid loading the content of large strings and BLOB values from disk.
んー、こういうことか?
注: test.sqliteファイルが6Gくらい領域使います
sqlite3 test.sqlite
create table blobnull(
col1 int,
col2 blob);
INSERT INTO blobnull(col1, col2)
WITH RECURSIVE
cte(x,y) AS (
SELECT random(),printf('%.*c', abs(random()) % 100000, 'x')
UNION ALL
SELECT random(),printf('%.*c', abs(random()) % 100000, 'x')
FROM cte
LIMIT 100000
)
SELECT x,y FROM cte;
INSERT INTO blobnull values(NULL, NULL);
少し古いSQLite version 3.31.1: 28秒
sqlite> select current_timestamp;select count(*) from blobnull where col2 is null;select current_timestamp;
2022-12-13 12:40:59
1
2022-12-13 12:41:27
最新のSQLite version 3.40.0: 2秒
sqlite> select current_timestamp;select count(*) from blobnull where col2 is null;select current_timestamp;
2022-12-13 12:28:47
1
2022-12-13 12:28:49
確かにはやくなってる。
1バイトキャラクタ(ここでは'x')を MySQLのREPEAT関数風に実行する際の元ネタ( printf)はこちら。
How to emulate REPEAT() in SQLite
2022.12.12 Monday
SQLite 最新版(2022-11-16 (3.40.0))の新機能: クエリプランナの拡張(a)
SQLite 最新版(2022-11-16 (3.40.0))の新機能: クエリプランナの拡張(a)
本エントリは SQLite Advent Calendar 2022の12日目です。
SQLite Release 3.40.0 On 2022-11-16
3.Query planner enhancements:
a.Recognize covering indexes on tables with more than 63 columns where columns beyond the 63rd column are used in the query and/or are referenced by the index.
んー、こういうことかな。
create table ci64(
col1 int,
col2 int,
col3 int,
col4 int,
col5 int,
col6 int,
col7 int,
col8 int,
col9 int,
col10 int,
col11 int,
col12 int,
col13 int,
col14 int,
col15 int,
col16 int,
col17 int,
col18 int,
col19 int,
col20 int,
col21 int,
col22 int,
col23 int,
col24 int,
col25 int,
col26 int,
col27 int,
col28 int,
col29 int,
col30 int,
col31 int,
col32 int,
col33 int,
col34 int,
col35 int,
col36 int,
col37 int,
col38 int,
col39 int,
col40 int,
col41 int,
col42 int,
col43 int,
col44 int,
col45 int,
col46 int,
col47 int,
col48 int,
col49 int,
col50 int,
col51 int,
col52 int,
col53 int,
col54 int,
col55 int,
col56 int,
col57 int,
col58 int,
col59 int,
col60 int,
col61 int,
col62 int,
col63 int,
col64 int,
col65 int,
col66 int,
col67 int,
col68 int);
INSERT INTO ci64(col1, col30, col67)
WITH RECURSIVE
cte(x,y,z) AS (
SELECT random(),random(),random()
UNION ALL
SELECT random(),random(),random()
FROM cte
LIMIT 1000000
)
SELECT x,y,z FROM cte;
create index test on ci64(col1,col30,col67);
ちょっと前のSQLiteで実行
sqlite> explain query plan select col1,col30,col67 from ci64;
QUERY PLAN
`--SCAN TABLE ci64
最新版(2022-11-16 (3.40.0))で実行
sqlite> explain query plan select col1,col30,col67 from ci64;
QUERY PLAN
`--SCAN ci64 USING COVERING INDEX test
なるほど、なるほど。
だがしかし、もともとのテーブル定義に問題あるんじゃないか :)
2022.12.10 Saturday
SQLite 最新版(2022-11-16 (3.40.0))の新機能: リカバリー機能
SQLite 最新版(2022-11-16 (3.40.0))の新機能: リカバリー機能
本エントリは SQLite Advent Calendar 2022の10日目のエントリです。
SQLite 最新版では、破損したデータベースファイルから一部のコンテンツを回復できるリカバリ拡張機能が追加されました。
もともと壊れにくいSQLiteのデータファイルですが、以下のコマンドでリカバリ用のSQL作成ができます。
sqlite3 corrupt.db .recover > data.sql
それを以下のコマンドでデータベースの再構築ができます。
sqlite3 recovered.db < data.sql
オプションもいくつかありますので、詳しくは以下のマニュアルをチェック!
Recovering Data From A Corrupt SQLite Database
2022.12.08 Thursday
db tech showcaseでのSQLite
2022.12.06 Tuesday
SQLiteクエリのみでダミーデータを作る
SQLiteクエリのみでダミーデータを作る
本エントリは SQLite Advent Calendar 2022の6日目のエントリです。
実行計画を見るのにダミーデータをたくさん格納したテーブルがすぐに作れると楽です。
最近のSQLiteはCTE(共通表式: Common Table Expression)が利用できるので、
例えば100万行のt3テーブルを以下のように簡単に作れます。
CREATE TABLE t3(id);
INSERT INTO t3
WITH RECURSIVE
cte(x) AS (
SELECT random()
UNION ALL
SELECT random()
FROM cte
LIMIT 1000000
)
SELECT x FROM cte;
SQLiteに限らずCTEが利用できるRDBMSならできますので、是非。
元ネタは以下のエントリ。
How to insert random data into a SQLite table using only queries?(stackoverflow)
2022.12.05 Monday
SQLiteの実行計画
2022.12.04 Sunday
SQLiteの仮想テーブル
SQLiteの仮想テーブル
本エントリは SQLite Advent Calendar 2022の4日目のエントリです。
SQLiteには独自の仮想テーブルという仕組みがあります。
SQLiteの仮想テーブルの仕組み
# 参照しているのはrunebook.devという(機械)翻訳ドキュメントを公開している(?) サイトです。
これはMySQLのストレージエンジンほどカッチリはしてないものの、SQL文からアクセス可能なインターフェースを、あたかもテーブルであるかのように公開することができます。たとえばCSVファイルをそのままCSVテーブルのように参照できたりします。こんな感じです。
SQLiteからCSVファイルにSQLを投げてみた
共有ライブラリを作成しなければならないので、そこが少しカベになりますが、
なかなか使える機能だと思います。
2022.12.02 Friday
2022年のSpatiaLite
本エントリは SQLite Advent Calendar 2022の2日目と
RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2022の2日目のクロスエントリです。
SpatiaLiteは、SQLiteを拡張して空間位置情報を扱えるようにするものです。
ざっくりいうとSQLite+SpatiaLiteは、PostgreSQL + PostGISの組み合わせにあたります。
バージョン4.xまでの概要は以下のページに詳しいです。
SpatiaLite?なにそれおいしいの?
Spatialite を使ってみる
さて2022年のSpartiaLiteは? といって調べてみたら、
なんと 最終バージョンは5.0.1で2021年のリリース。
2022年の活動はございませんでした!!
(終)
....というわけにもいきませんので、現行最新バージョン5.0についていくつか。新規機能のリストは以下で確認できます。
news about SpatiaLite 5.0.0
Drop-RenameTable and RenameColumn
SQLite 3.25.0 of 2018-09-15でALTER TABLEが改善されたおかげで、そのバージョン以降のSQLiteを使う場合、 RenameTable() と RenameColumn() でそれぞれのリネームが利用できるようになります。
また、DropGeoTable()は非推奨(DEPRECATED)になりました。代わりにDropTable()を利用してください。
GIS関連の機能については、まだ違いや、新規機能のありがたみがわかるほど極めていないため、私が気になったのはプロシジャやストアドプロシジャの対応です。
SQL Procedures, Stored Procedures and Stored Variables: a quick intro
SQLite本体でストアドプロシジャ対応していませんが、結局ローカルで実行するだけなので、様々なインチキ(笑)で対応できそうだし、しているようでございます。この部分はSQLite Adventcalendarで触れていきたいですね。
|
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
+ RECOMMEND
Firebird 徹底入門 (JUGEMレビュー ») 木村 明治,はやし つとむ,坂井 恵
Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
+ LINKS
+ PROFILE
|