@peerbit/indexer-sqlite3 3.0.6 → 3.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/sqlite3/sqlite3.worker.min.js +6 -1
- package/dist/benchmark/query-planner.d.ts +2 -0
- package/dist/benchmark/query-planner.d.ts.map +1 -0
- package/dist/benchmark/query-planner.js +97 -0
- package/dist/benchmark/query-planner.js.map +1 -0
- package/dist/index.min.js +535 -183
- package/dist/index.min.js.map +3 -3
- package/dist/src/engine.d.ts +15 -4
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +364 -179
- package/dist/src/engine.js.map +1 -1
- package/dist/src/query-planner.d.ts +20 -0
- package/dist/src/query-planner.d.ts.map +1 -1
- package/dist/src/query-planner.js +191 -21
- package/dist/src/query-planner.js.map +1 -1
- package/dist/src/schema.d.ts +6 -2
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +11 -8
- package/dist/src/schema.js.map +1 -1
- package/dist/src/sqlite3-messages.worker.d.ts +8 -1
- package/dist/src/sqlite3-messages.worker.d.ts.map +1 -1
- package/dist/src/sqlite3-messages.worker.js.map +1 -1
- package/dist/src/sqlite3.browser.d.ts.map +1 -1
- package/dist/src/sqlite3.browser.js +21 -0
- package/dist/src/sqlite3.browser.js.map +1 -1
- package/dist/src/sqlite3.wasm.d.ts.map +1 -1
- package/dist/src/sqlite3.wasm.js +4 -1
- package/dist/src/sqlite3.wasm.js.map +1 -1
- package/dist/src/sqlite3.worker.js +6 -0
- package/dist/src/sqlite3.worker.js.map +1 -1
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/src/engine.ts +464 -235
- package/src/query-planner.ts +247 -22
- package/src/schema.ts +21 -4
- package/src/sqlite3-messages.worker.ts +6 -0
- package/src/sqlite3.browser.ts +33 -0
- package/src/sqlite3.wasm.ts +4 -1
- package/src/sqlite3.worker.ts +6 -0
- package/src/types.ts +3 -0
|
@@ -17732,7 +17732,6 @@ var create = async (directory, options) => {
|
|
|
17732
17732
|
directory: poolDirectory
|
|
17733
17733
|
});
|
|
17734
17734
|
poolUtil = activePoolUtil;
|
|
17735
|
-
await activePoolUtil.reserveMinimumCapacity(100);
|
|
17736
17735
|
sqliteDb = new activePoolUtil.OpfsSAHPoolDb(dbFileName);
|
|
17737
17736
|
} else {
|
|
17738
17737
|
sqliteDb = new sqlite32.oo1.DB(":memory:");
|
|
@@ -17852,6 +17851,12 @@ var SqliteWorkerHandler = class {
|
|
|
17852
17851
|
await db.prepare(message.sql, message.id);
|
|
17853
17852
|
return statementId;
|
|
17854
17853
|
}
|
|
17854
|
+
if (message.type === "prepare-many") {
|
|
17855
|
+
for (const statement2 of message.statements) {
|
|
17856
|
+
await db.prepare(statement2.sql, statement2.id);
|
|
17857
|
+
}
|
|
17858
|
+
return message.statements.map((statement2) => statement2.id);
|
|
17859
|
+
}
|
|
17855
17860
|
if (message.type === "close") {
|
|
17856
17861
|
await db.close();
|
|
17857
17862
|
this.databases.delete(message.databaseId);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-planner.d.ts","sourceRoot":"","sources":["../../benchmark/query-planner.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import DB from "better-sqlite3";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { performance } from "node:perf_hooks";
|
|
6
|
+
const rows = Number(process.env.QUERY_PLANNER_BENCH_ROWS ?? 500_000);
|
|
7
|
+
const runs = Number(process.env.QUERY_PLANNER_BENCH_RUNS ?? 50);
|
|
8
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "peerbit-qplanner-"));
|
|
9
|
+
const dbPath = path.join(tmpDir, "bench.sqlite");
|
|
10
|
+
const percentile = (values, p) => {
|
|
11
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
12
|
+
return sorted[Math.floor((sorted.length - 1) * p)];
|
|
13
|
+
};
|
|
14
|
+
const bench = (db, name, sql, params) => {
|
|
15
|
+
const stmt = db.prepare(sql);
|
|
16
|
+
for (let i = 0; i < 5; i++) {
|
|
17
|
+
stmt.all(...params);
|
|
18
|
+
}
|
|
19
|
+
const times = [];
|
|
20
|
+
for (let i = 0; i < runs; i++) {
|
|
21
|
+
const start = performance.now();
|
|
22
|
+
stmt.all(...params);
|
|
23
|
+
times.push(performance.now() - start);
|
|
24
|
+
}
|
|
25
|
+
const plan = db
|
|
26
|
+
.prepare(`EXPLAIN QUERY PLAN ${sql}`)
|
|
27
|
+
.all(...params)
|
|
28
|
+
.map((row) => String(row.detail))
|
|
29
|
+
.join("\n");
|
|
30
|
+
return {
|
|
31
|
+
name,
|
|
32
|
+
avgMs: times.reduce((sum, value) => sum + value, 0) / times.length,
|
|
33
|
+
p50Ms: percentile(times, 0.5),
|
|
34
|
+
minMs: Math.min(...times),
|
|
35
|
+
maxMs: Math.max(...times),
|
|
36
|
+
plan,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
try {
|
|
40
|
+
const db = new DB(dbPath);
|
|
41
|
+
db.pragma("journal_mode = OFF");
|
|
42
|
+
db.pragma("synchronous = OFF");
|
|
43
|
+
db.pragma("temp_store = MEMORY");
|
|
44
|
+
db.exec("CREATE TABLE t(id INTEGER PRIMARY KEY, a INT, b INT, c INT)");
|
|
45
|
+
const insert = db.prepare("INSERT INTO t(id, a, b, c) VALUES (?, ?, ?, ?)");
|
|
46
|
+
const insertMany = db.transaction(() => {
|
|
47
|
+
for (let i = 1; i <= rows; i++) {
|
|
48
|
+
insert.run(i, i % 10, i % 1000, Math.floor(Math.random() * rows));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const loadStart = performance.now();
|
|
52
|
+
insertMany();
|
|
53
|
+
const loadMs = performance.now() - loadStart;
|
|
54
|
+
const indexTimes = {};
|
|
55
|
+
for (const [name, sql] of [
|
|
56
|
+
["old_forward", "CREATE INDEX idx_old_a_b_c ON t(a, b, c)"],
|
|
57
|
+
["old_reverse", "CREATE INDEX idx_old_c_b_a ON t(c, b, a)"],
|
|
58
|
+
["new_semantic", "CREATE INDEX idx_new_a_c_b ON t(a, c, b)"],
|
|
59
|
+
]) {
|
|
60
|
+
const start = performance.now();
|
|
61
|
+
db.exec(sql);
|
|
62
|
+
indexTimes[name] = performance.now() - start;
|
|
63
|
+
}
|
|
64
|
+
db.exec("ANALYZE");
|
|
65
|
+
const query = "SELECT id FROM t WHERE a = ? AND b BETWEEN ? AND ? ORDER BY c LIMIT ?";
|
|
66
|
+
const forcedOldForward = "SELECT id FROM t INDEXED BY idx_old_a_b_c WHERE a = ? AND b BETWEEN ? AND ? ORDER BY c LIMIT ?";
|
|
67
|
+
const forcedOldReverse = "SELECT id FROM t INDEXED BY idx_old_c_b_a WHERE a = ? AND b BETWEEN ? AND ? ORDER BY c LIMIT ?";
|
|
68
|
+
const forcedNew = "SELECT id FROM t INDEXED BY idx_new_a_c_b WHERE a = ? AND b BETWEEN ? AND ? ORDER BY c LIMIT ?";
|
|
69
|
+
const params = [1, 0, 999, 50];
|
|
70
|
+
const results = [
|
|
71
|
+
bench(db, "old forced (a,b,c)", forcedOldForward, params),
|
|
72
|
+
bench(db, "old forced reverse (c,b,a)", forcedOldReverse, params),
|
|
73
|
+
bench(db, "new semantic forced (a,c,b)", forcedNew, params),
|
|
74
|
+
bench(db, "sqlite choice with all indexes", query, params),
|
|
75
|
+
];
|
|
76
|
+
/* eslint-disable no-console */
|
|
77
|
+
console.log(JSON.stringify({
|
|
78
|
+
rows,
|
|
79
|
+
runs,
|
|
80
|
+
loadMs,
|
|
81
|
+
indexTimes,
|
|
82
|
+
}, null, 2));
|
|
83
|
+
console.table(results.map(({ name, avgMs, p50Ms, minMs, maxMs }) => ({
|
|
84
|
+
name,
|
|
85
|
+
avgMs: Number(avgMs.toFixed(3)),
|
|
86
|
+
p50Ms: Number(p50Ms.toFixed(3)),
|
|
87
|
+
minMs: Number(minMs.toFixed(3)),
|
|
88
|
+
maxMs: Number(maxMs.toFixed(3)),
|
|
89
|
+
})));
|
|
90
|
+
for (const result of results) {
|
|
91
|
+
console.log(`\n${result.name}\n${result.plan}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=query-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-planner.js","sourceRoot":"","sources":["../../benchmark/query-planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,CAAC;AACrE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;AAChE,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAWjD,MAAM,UAAU,GAAG,CAAC,MAAgB,EAAE,CAAS,EAAE,EAAE;IAClD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CACb,EAAe,EACf,IAAY,EACZ,GAAW,EACX,MAAiB,EACH,EAAE;IAChB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACb,OAAO,CAAC,sBAAsB,GAAG,EAAE,CAAC;SACpC,GAAG,CAAC,GAAG,MAAM,CAAC;SACd,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAE,GAA0B,CAAC,MAAM,CAAC,CAAC;SACxD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACN,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;QAClE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;QAC7B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,IAAI;KACJ,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,CAAC;IACJ,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,UAAU,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE7C,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI;QACzB,CAAC,aAAa,EAAE,0CAA0C,CAAC;QAC3D,CAAC,aAAa,EAAE,0CAA0C,CAAC;QAC3D,CAAC,cAAc,EAAE,0CAA0C,CAAC;KACnD,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC9C,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEnB,MAAM,KAAK,GACV,uEAAuE,CAAC;IACzE,MAAM,gBAAgB,GACrB,gGAAgG,CAAC;IAClG,MAAM,gBAAgB,GACrB,gGAAgG,CAAC;IAClG,MAAM,SAAS,GACd,gGAAgG,CAAC;IAClG,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAE/B,MAAM,OAAO,GAAG;QACf,KAAK,CAAC,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,CAAC;QACzD,KAAK,CAAC,EAAE,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,CAAC;QACjE,KAAK,CAAC,EAAE,EAAE,6BAA6B,EAAE,SAAS,EAAE,MAAM,CAAC;QAC3D,KAAK,CAAC,EAAE,EAAE,gCAAgC,EAAE,KAAK,EAAE,MAAM,CAAC;KAC1D,CAAC;IAEF,+BAA+B;IAC/B,OAAO,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CACb;QACC,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,UAAU;KACV,EACD,IAAI,EACJ,CAAC,CACD,CACD,CAAC;IACF,OAAO,CAAC,KAAK,CACZ,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KAC/B,CAAC,CAAC,CACH,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACF,CAAC;QAAS,CAAC;IACV,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC"}
|