semillero-INVIMA/benchmarks/scripts/run-query02-sequential.js

87 lines
2.5 KiB
JavaScript

const { performance } = require('perf_hooks');
const {
config,
createClient,
ensureDir,
explainSql,
explainSummary,
query02Dir,
query02Sql,
summarizeRows,
writeCsv,
writeJson
} = require('./query02-lib');
const warmups = Number.parseInt(process.env.BENCHMARK_WARMUPS || config.warmupRepetitions, 10);
const repetitions = Number.parseInt(process.env.BENCHMARK_REPETITIONS || config.measuredRepetitions, 10);
const runOne = async (client, repetition, measured) => {
const timestamp = new Date().toISOString();
const started = performance.now();
const result = await client.query(explainSql(query02Sql));
const total = performance.now() - started;
const summary = explainSummary(result.rows[0]['QUERY PLAN'][0]);
return {
phase: 'query02_optimized',
query_id: 'query_02',
query_name: 'Catalogo general paginado LIMIT 25',
query_group: 'estructurada',
repetition,
measured,
timestamp,
endpoint_total_ms: total,
sql_ms: summary.execution_ms,
planning_ms: summary.planning_ms,
execution_ms: summary.execution_ms,
rows_returned: summary.actual_rows,
estimated_rows: summary.estimated_rows,
actual_rows: summary.actual_rows,
shared_hit_blocks: summary.shared_hit_blocks,
shared_read_blocks: summary.shared_read_blocks,
temp_read_blocks: summary.temp_read_blocks,
temp_written_blocks: summary.temp_written_blocks,
active_pg_connections: 1,
cpu_percent_process: 0,
memory_rss_mb: process.memoryUsage().rss / 1024 / 1024,
disk_fs_read_ops: 0,
disk_fs_write_ops: 0,
success: true,
error_message: ''
};
};
const main = async () => {
ensureDir(query02Dir);
const client = await createClient();
const raw = [];
try {
for (let i = 1; i <= warmups; i += 1) {
await runOne(client, i, false);
process.stdout.write(`query02 warmup ${i}/${warmups}\n`);
}
for (let i = 1; i <= repetitions; i += 1) {
const row = await runOne(client, i, true);
raw.push(row);
process.stdout.write(`query02 optimized ${i}/${repetitions} ${row.endpoint_total_ms.toFixed(2)}ms\n`);
}
} finally {
await client.end();
}
const summary = summarizeRows(raw, ['phase', 'query_id', 'query_name', 'query_group']);
writeCsv(`${query02Dir}/optimized_raw.csv`, raw);
writeCsv(`${query02Dir}/optimized_summary.csv`, summary);
writeJson(`${query02Dir}/optimized.json`, {
generatedAt: new Date().toISOString(),
warmups,
repetitions,
summary
});
};
main().catch((error) => {
console.error(error);
process.exit(1);
});