semillero-INVIMA/benchmarks/scripts/capture-explain.js

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);
});