피드로 돌아가기
Building a SQL Lexer in Rust: Why I Replaced `Vec<char>` with `&str` and `Ident(String)` with Spans
Dev.toDev.to
Database

Rust Ownership 기반 메모리 최적화로 Lexer 할당 제거

Building a SQL Lexer in Rust: Why I Replaced `Vec<char>` with `&str` and `Ident(String)` with Spans

Musab Khan2026년 6월 6일3intermediate

Context

초기 설계에서 Vec 기반 입력 처리와 Ident(String) 구조를 사용함에 따라 발생한 불필요한 메모리 할당 및 데이터 복제 문제 분석.

Technical Solution

  • Vec를 &str로 대체하여 입력 버퍼 복제 제거 및 Lifetime 기반 Borrowing 구조 설계
  • Ident(String) 구조를 Span { start, end, line, column } 기반으로 변경하여 토큰 내 데이터 중복 제거
  • 원본 SQL 소스 텍스트를 Single Source of Truth로 유지하며 필요한 경우에만 바이트 범위로 텍스트를 복원하는 방식 채택
  • Rust Enum의 크기가 가장 큰 Variant에 의해 결정되는 특성을 고려하여 Token 크기를 최적화하는 설계 적용

- 입력 데이터의 복제본을 생성하는 대신 원본 데이터의 슬라이스(&str)와 Lifetime을 활용하는지 검토 - 토큰이나 메시지 객체 내에 전체 문자열을 포함하는 대신 인덱스 기반의 Span 구조를 사용하여 메모리 풋프린트 최소화 - Enum Variant의 데이터 크기가 전체 Enum 크기에 미치는 영향을 분석하여 데이터 구조 최적화

원문 읽기