쿼리 성능
Drizzle 는 SQL 위에 얇은 TypeScript 레이어를 제공하며, 거의 0에 가까운 오버헤드를 가지고 있습니다. 이를 실제로 0으로 만들기 위해, 여러분은 우리의 prepared statements API 를 활용할 수 있습니다.
데이터베이스에서 쿼리를 실행할 때 다음과 같은 일들이 발생합니다:
쿼리 빌더의 모든 설정이 SQL 문자열로 연결됩니다.
해당 문자열과 파라미터가 데이터베이스 드라이버로 전송됩니다.
드라이버는 SQL 쿼리를 바이너리 SQL 실행 가능 형식으로 컴파일하고 데이터베이스로 보냅니다.
prepared statements를 사용하면, Drizzle ORM 측에서 SQL 연결을 한 번만 수행하고, 이후 데이터베이스 드라이버가 매번 쿼리를 파싱하는 대신 미리 컴파일된 바이너리 SQL을 재사용할 수 있습니다. 이는 특히 큰 SQL 쿼리에서 극적인 성능 향상을 가져옵니다.
다양한 데이터베이스 드라이버는 prepared statements를 각기 다른 방식으로 지원하며, 때로는 Drizzle ORM이 better-sqlite3 드라이버보다 더 빠르게 동작할 수 있습니다.
준비된 쿼리(Prepared Statement)
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 ();
const db = drizzle ( ... );
const prepared = db .select () .from (customers) .prepare ();
const res1 = await prepared .execute ();
const res2 = await prepared .execute ();
const res3 = await prepared .execute ();
const db = drizzle ( ... );
const prepared = db .select () .from (customers) .prepare ();
const res1 = prepared .all ();
const res2 = prepared .all ();
const res3 = prepared .all ();
const db = drizzle ( ... );
const prepared = db .select () .from (customers) .prepare ();
const res1 = await prepared .execute ();
const res2 = await prepared .execute ();
const res3 = await prepared .execute ();
플레이스홀더
동적인 런타임 값을 삽입해야 할 때는 sql.placeholder(...)
API를 사용할 수 있습니다.
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%'
import { sql } from "drizzle-orm" ;
const p1 = db
.select ()
.from (customers)
.where ( eq ( customers .id , sql .placeholder ( 'id' )))
.prepare ()
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 ();
await p2 .execute ({ name : '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'
import { sql } from "drizzle-orm" ;
const p1 = db
.select ()
.from (customers)
.where ( eq ( customers .id , sql .placeholder ( 'id' )))
.prepare ()
p1 .get ({ id : 10 }) // SELECT * FROM customers WHERE id = 10
p1 .get ({ 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 .all ({ name : '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'
import { sql } from "drizzle-orm" ;
const p1 = db
.select ()
.from (customers)
.where ( eq ( customers .id , sql .placeholder ( 'id' )))
.prepare ()
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 ();
await p2 .execute ({ name : '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'