InfoGrab DocsInfoGrab Docs

쿼리 수 제한

GitLab에서 컨트롤러, API 엔드포인트, Sidekiq 워커별 SQL 쿼리 수 제한 규칙과 제한 비활성화 방법을 설명합니다.

각 컨트롤러, API 엔드포인트, Sidekiq 워커는 최대 100개의 SQL 쿼리를 실행할 수 있습니다. 100개 이상의 SQL 쿼리가 실행되는 경우, 이는 수정이 필요한 성능 문제 입니다. 실패한 테스트 해결 # 테스트 환경에서는 이 임계값을 초과하면 오류가 발생합니다. 테스트가 100개 이상의 SQL 쿼리를 실행하여 실패하는 경우 다음 두 가지 해결 방법이 있습니다: 실행되는 SQL 쿼리 수를 줄입니다. 해당 컨트롤러 또는 API 엔드포인트에 대한 쿼리 제한을 일시적으로 비활성화합니다. 쿼리 제한 비활성화는 기존 컨트롤러 또는 엔드포인트가 원인인 경우에만 사용해야 합니다. 이 경우 SQL 쿼리 수를 줄이는 데 많은 노력이 필요할 수 있습니다. 새로 추가된 컨트롤러와 엔드포인트는 100개 이상의 SQL 쿼리를 실행할 수 없으며, 이 규칙에는 예외가 없습니다. 파이프라인 안정성 # 기본 브랜치 파이프라인에서 쿼리 제한 오류가 발생하기 시작하면, 지침 에 따라 쿼리 제한을 비활성화하세요. 제한을 비활성화할 때는 항상 이슈를 연결하고 우선순위를 지정하여 과도한 쿼리 수를 조사할 수 있도록 해야 합니다. 쿼리 제한 비활성화 # 컨트롤러에 대한 쿼리 제한을 비활성화해야 하는 경우, 먼저 이슈를 생성해야 합니다. 이 이슈는 (가급적 제목에) 해당 컨트롤러 또는 엔드포인트를 언급하고 적절한 라벨( database , performance , 그리고 Discussion 과 같은 팀별 라벨 중 하나 이상)을 포함해야 합니다. GitLab 17.2 이후, QueryLimiting.disable 은 새로운 임계값(무제한이 아닌)을 설정해야 합니다. 이슈가 생성된 후, 해당 코드에서 쿼리 제한을 비활성화할 수 있습니다. Rails 컨트롤러의 경우 가능한 한 일찍 실행되는 before_action 훅을 생성하는 것이 좋습니다. 호출된 메서드는 Gitlab::QueryLimiting.disable!('이슈 URL') 을 호출해야 합니다. 예를 들면: class MyController < ApplicationController before_action :disable_query_limiting, only: [:show] def index # ... end def show # ... end def disable_query_limiting Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/...', new_threshold: 200) end end before_action 을 사용하면 해당 컨트롤러 메서드를 수정할 필요가 없어 머지 충돌 가능성이 줄어듭니다. Grape API 엔드포인트의 경우 특정 엔드포인트 이전에 훅을 실행하는 신뢰할 수 있는 방법이 없습니다. 따라서 다음과 같이 엔드포인트에 직접 허용 목록 호출을 추가해야 합니다: get '/projects/:id/foo' do Gitlab::QueryLimiting.disable!('...', new_threshold: 200) # ...