DEV Community

Mohammad Waseem
Mohammad Waseem

Posted on

Optimizing Slow Database Queries with TypeScript and Open Source Tools in a DevOps Pipeline

Optimizing Slow Database Queries with TypeScript and Open Source Tools in a DevOps Pipeline

Performance bottlenecks due to slow database queries can significantly impact application responsiveness and user experience. As a DevOps specialist, leveraging the power of TypeScript alongside open source tools offers an efficient and scalable approach to diagnose, analyze, and optimize slow queries.

Understanding the Challenge

Slow queries often result from inefficient SQL statements, missing indexes, or suboptimal database schema designs. The goal is to identify these queries, analyze their execution plans, and apply targeted improvements.

Setting Up the Environment

To automate query analysis, we'll create a TypeScript-based tool that integrates with our database (PostgreSQL in this example) and uses open source libraries for performance profiling and visualization.

First, ensure you have Node.js and TypeScript installed. Then, initialize your project:

mkdir query-optimizer
cd query-optimizer
npm init -y
npm install typescript pg typeorm prettier --save
npx tsc --init
Enter fullscreen mode Exit fullscreen mode

Connecting to the Database

Create a db.ts module to establish a connection:

// db.ts
import { createPool } from 'pg';

const pool = createPool({
  user: 'your_user',
  host: 'localhost',
  database: 'your_db',
  password: 'your_password',
  port: 5432,
});

export default pool;
Enter fullscreen mode Exit fullscreen mode

Extracting Slow Queries

Next, write a script to fetch slow queries logged in PostgreSQL. Configure PostgreSQL logging with log_min_duration_statement to track queries exceeding a threshold (e.g., 200ms).

-- postgresql.conf
log_min_duration_statement = 200
Enter fullscreen mode Exit fullscreen mode

Assuming this is set, we can query the pg_stat_statements extension for aggregated stats:

// fetchSlowQueries.ts
import pool from './db';

async function getSlowQueries() {
  const query = `SELECT query, total_time, calls, mean_time
                 FROM pg_stat_statements
                 ORDER BY total_time DESC
                 LIMIT 10;`;
  const res = await pool.query(query);
  return res.rows;
}

getSlowQueries().then(console.log).catch(console.error);
Enter fullscreen mode Exit fullscreen mode

Analyzing and Visualizing Results

To visualize query performance, we can use open source libraries like chart.js integrated with Node.js or export the data into JSON for external visualization tools.

Example of exporting for visualization:

import * as fs from 'fs';

async function exportQueries() {
  const data = await getSlowQueries();
  fs.writeFileSync('slow_queries.json', JSON.stringify(data, null, 2));
  console.log('Exported slow queries to slow_queries.json');
}

exportQueries();
Enter fullscreen mode Exit fullscreen mode

Optimizing Queries

Armed with insights, the next step involves practical fixes—adding indexes, rewriting queries, or updating schema. For example, if a query is slow due to missing indexes, you can create one:

async function createIndex() {
  await pool.query(`CREATE INDEX idx_query_column ON your_table(column_name);`);
  console.log('Index created');
}

createIndex().catch(console.error);
Enter fullscreen mode Exit fullscreen mode

Automating the Workflow

Embed these scripts into your CI/CD pipeline to routinely monitor and optimize queries. Use tools like Jenkins, GitHub Actions, or GitLab CI to trigger analysis after deployments.

Conclusion

By combining TypeScript with open source database profiling tools, DevOps teams can rapidly identify slow queries and implement effective optimizations. This approach ensures continuous performance improvements, reduces downtime, and enhances user satisfaction.

Always review query plans (EXPLAIN ANALYZE) for precise insights and adjust your index strategy accordingly. With a systematic, automated process, performance bottlenecks become manageable and predictable, aligning with DevOps principles of continuous improvement and automation.


🛠️ QA Tip

I rely on TempoMail USA to keep my test environments clean.

Top comments (0)