쿼리 성능

Drizzle는 SQL 위에 얇은 TypeScript 레이어를 제공하며, 거의 0에 가까운 오버헤드를 가지고 있습니다. 이를 실제로 0으로 만들기 위해, 여러분은 우리의 prepared statements API를 활용할 수 있습니다.

데이터베이스에서 쿼리를 실행할 때 다음과 같은 일들이 발생합니다:

prepared statements를 사용하면, Drizzle ORM 측에서 SQL 연결을 한 번만 수행하고, 이후 데이터베이스 드라이버가 매번 쿼리를 파싱하는 대신 미리 컴파일된 바이너리 SQL을 재사용할 수 있습니다. 이는 특히 큰 SQL 쿼리에서 극적인 성능 향상을 가져옵니다.

다양한 데이터베이스 드라이버는 prepared statements를 각기 다른 방식으로 지원하며, 때로는 Drizzle ORM이 better-sqlite3 드라이버보다 더 빠르게 동작할 수 있습니다.

준비된 쿼리(Prepared Statement)

PostgreSQL
MySQL
SQLite
SingleStore
const db = drizzle(...);

const prepared = db.select().from(customers).prepare("statement_name");

const res1 = await prepared.execute();
const res2 = await prepared.execute();
const res3 = await prepared.execute();

플레이스홀더

동적인 런타임 값을 삽입해야 할 때는 sql.placeholder(...) API를 사용할 수 있습니다.

PostgreSQL
MySQL
SQLite
SingleStore
import { sql } from "drizzle-orm";

const p1 = db
  .select()
  .from(customers)
  .where(eq(customers.id, sql.placeholder('id')))
  .prepare("p1")

await p1.execute({ id: 10 }) // SELECT * FROM customers WHERE id = 10
await p1.execute({ id: 12 }) // SELECT * FROM customers WHERE id = 12

const p2 = db
  .select()
  .from(customers)
  .where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`)
  .prepare("p2");

await p2.execute({ name: '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'