InfoGrab DocsInfoGrab Docs

SQL 쿼리 가이드라인

GitLab에서 ActiveRecord/Arel 또는 raw SQL 쿼리를 작성할 때 따라야 하는 다양한 SQL 쿼리 가이드라인을 설명합니다.

이 문서는 ActiveRecord/Arel 또는 raw SQL 쿼리를 사용하여 SQL 쿼리를 작성할 때 따라야 하는 다양한 가이드라인을 설명합니다. LIKE 구문 사용 # 데이터를 검색하는 가장 일반적인 방법은 LIKE 구문을 사용하는 것입니다. 예를 들어, 제목이 Draft: 로 시작하는 모든 이슈를 가져오려면 다음 쿼리를 작성합니다: SELECT * FROM issues WHERE title LIKE 'Draft:%'; PostgreSQL에서 LIKE 구문은 대소문자를 구분합니다. 대소문자를 구분하지 않는 LIKE 를 수행하려면 ILIKE 를 대신 사용해야 합니다. 이를 자동으로 처리하려면, raw SQL 프래그먼트 대신 Arel을 사용하여 LIKE 쿼리를 작성해야 합니다. Arel은 PostgreSQL에서 자동으로 ILIKE 를 사용하기 때문입니다. Issue.where('title LIKE ?', 'Draft:%') 대신 다음과 같이 작성합니다: Issue.where(Issue.arel_table[:title].matches('Draft:%')) 여기서 matches 는 사용 중인 데이터베이스에 따라 올바른 LIKE / ILIKE 구문을 생성합니다. 여러 OR 조건을 연결해야 하는 경우 Arel을 사용하여 다음과 같이 할 수 있습니다: table = Issue.arel_table Issue.where(table[:title].matches('Draft:%').or(table[:foo].matches('Draft:%'))) PostgreSQL에서는 다음과 같은 결과를 생성합니다: SELECT * FROM issues WHERE (title ILIKE 'Draft:%' OR foo ILIKE 'Draft:%') LIKE와 인덱스 # PostgreSQL은 와일드카드가 시작 부분에 있는 LIKE / ILIKE 를 사용할 때 인덱스를 사용하지 않습니다. 예를 들어, 다음 쿼리는 인덱스를 사용하지 않습니다: SELECT * FROM issues WHERE title ILIKE '%Draft:%'; ILIKE 의 값이 와일드카드로 시작하기 때문에 데이터베이스는 인덱스를 어디서부터 스캔해야 할지 알 수 없어 인덱스를 사용할 수 없습니다. 다행히 PostgreSQL은 해결책을 제공합니다: trigram Generalized Inverted Index(GIN) 인덱스입니다. 이러한 인덱스는 다음과 같이 생성할 수 있습니다: CREATE INDEX [CONCURRENTLY] index_name_here ON table_name USING GIN(column_name gin_trgm_ops); 핵심은 GIN(column_name gin_trgm_ops) 부분입니다. 이는 연산자 클래스가 gin_trgm_ops 로 설정된 GIN 인덱스 를 생성합니다. 이러한 인덱스는 ILIKE / LIKE 에서 사용할 수 있으며 성능을 크게 향상시킬 수 있습니다. 이러한 인덱스의 단점 중 하나는 (인덱싱된 데이터의 양에 따라) 크기가 상당히 커질 수 있다는 것입니다.