61 lines
1.9 KiB
JavaScript
61 lines
1.9 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const { benchmarkDir, createClient, ensureDir, loadQueries, resultsDir, writeJson } = require('./benchmark-lib');
|
|
|
|
const phase = process.argv[2] === 'after' ? 'after' : 'before';
|
|
const outDir = path.join(resultsDir, phase === 'after' ? 'explain_after' : 'explain_before');
|
|
|
|
const explainSql = (sql) => `EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS, FORMAT JSON) ${sql.replace(/;\s*$/, '')}`;
|
|
|
|
const main = async () => {
|
|
ensureDir(outDir);
|
|
const queries = loadQueries();
|
|
const client = await createClient();
|
|
const manifest = [];
|
|
|
|
try {
|
|
for (const query of queries) {
|
|
const startedAt = new Date().toISOString();
|
|
const file = path.join(outDir, `${query.id}.json`);
|
|
try {
|
|
const result = await client.query(explainSql(query.sql));
|
|
writeJson(file, {
|
|
phase,
|
|
generatedAt: startedAt,
|
|
queryId: query.id,
|
|
queryName: query.name,
|
|
sqlFile: query.sqlFile,
|
|
explain: result.rows[0]?.['QUERY PLAN']?.[0] || null
|
|
});
|
|
manifest.push({ queryId: query.id, success: true, file: path.relative(benchmarkDir, file) });
|
|
console.log(`${phase} ${query.id} explain ok`);
|
|
} catch (error) {
|
|
const errorFile = path.join(outDir, `${query.id}.error.json`);
|
|
writeJson(errorFile, {
|
|
phase,
|
|
generatedAt: startedAt,
|
|
queryId: query.id,
|
|
queryName: query.name,
|
|
sqlFile: query.sqlFile,
|
|
error: String(error?.message || error)
|
|
});
|
|
manifest.push({ queryId: query.id, success: false, file: path.relative(benchmarkDir, errorFile) });
|
|
console.log(`${phase} ${query.id} explain fail`);
|
|
}
|
|
}
|
|
} finally {
|
|
await client.end();
|
|
}
|
|
|
|
writeJson(path.join(outDir, 'manifest.json'), {
|
|
phase,
|
|
generatedAt: new Date().toISOString(),
|
|
items: manifest
|
|
});
|
|
};
|
|
|
|
main().catch((error) => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|