Belajar Drizzle ORM - Prepared Statements & Performance
Episode 14 of 21

Belajar Drizzle ORM - Prepared Statements & Performance

Prepared statements dengan .prepare() untuk caching SQL di database server, reuse across requests untuk performa lebih baik, performance optimization termasuk index strategy dan connection pooling, serta profiling queries dengan toSQL() dan database query logging.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 13 kita mempelajari Transactions & Batch — operasi atomic dan bulk operations — pada episode ini kita membahas prepared statements dan performance: bagaimana mengoptimalkan query yang berjalan berulang kali, caching SQL di database server, dan profiling untuk mengidentifikasi bottleneck.

Prepared statements adalah salah satu optimasi paling fundamental di database — SQL di-cache di server sehingga tidak perlu di-parse ulang setiap kali.

Prepared Statements

Konsep Dasar

Prepared statement dengan placeholder
import { placeholder } from 'drizzle-orm'
 
const getUserById = db
  .select()
  .from(users)
  .where(eq(users.id, placeholder('id')))
  .prepare()
 
// Gunakan prepared statement
const user = await getUserById.execute({ id: 1 })
const anotherUser = await getUserById.execute({ id: 2 })

SQL di-cache di database server — getUserById hanya di-parse sekali, lalu di-reuse dengan parameter berbeda.

Mengapa Prepared Statements Penting

ManfaatPenjelasan
SQL cachingSQL di-cache di server, tidak perlu parse ulang
PerformanceLebih cepat untuk queries yang sama berulang kali
SecurityParameterized, aman dari SQL injection
ReuseBisa digunakan berkali-kali dengan parameter berbeda

Performance Optimization

Index Strategy

Tambahkan index untuk kolom yang sering di-query
import { index } from 'drizzle-orm/pg-core'
 
export const users = pgTable('users', {
  // ... columns
}, (table) => ({
  emailIdx: index('users_email_idx').on(table.email),
  roleIdx: index('users_role_idx').on(table.role),
}))

Index mempercepat query yang menggunakan WHERE, JOIN, dan ORDER BY pada kolom tertentu.

Connection Pooling

Connection pooling untuk PostgreSQL
import { drizzle } from 'drizzle-orm/postgres-js'
import postgres from 'postgres'
 
const client = postgres(process.env.DATABASE_URL!, {
  max: 20,           // Maximum connections
  idle_timeout: 20,  // Close idle connections
})

Connection pooling memastikan koneksi database di-reuse daripada dibuat baru setiap request.

Profiling Queries

Lihat SQL yang Di-Generate

Print SQL query
const query = db.select().from(users).where(eq(users.age, 25))
console.log(query.toSQL())
// { sql: 'SELECT * FROM "users" WHERE "age" = $1', params: [25] }

Database Query Logging

Aktifkan query logging di PostgreSQL
# postgresql.conf
log_statement = 'all'

Log semua query yang dijalankan ke database — membantu untuk debugging dan performance analysis.

Tip

Gunakan prepared statements untuk hot path queries — endpoint API yang paling sering dipanggil. Index kolom yang sering di-gunakan di WHERE dan JOIN. Connection pooling wajib untuk production.

Penutup

Pada episode 14 ini, kalian telah memahami Prepared Statements & Performance:

  • Prepared statements dengan .prepare() caching SQL di database server.
  • Reuse prepared statement dengan parameter berbeda.
  • Index kolom yang sering di-query untuk performance.
  • Connection pooling wajib untuk production.
  • Profiling dengan toSQL() dan database query logging.

Di episode 15 selanjutnya kita akan mempelajari Raw SQL & Template Literals — executing raw SQL, SQL template literals yang aman dari SQL injection, serta kapan menggunakan raw SQL vs query builder. Sampai jumpa di episode 15!

Belajar Drizzle ORM - Prepared Statements & Performance | Belajar Drizzle ORM