InfoGrab DocsInfoGrab Docs

ClickHouse를 활용한 머지 리퀘스트 애널리틱스

ClickHouse를 사용하여 머지 리퀘스트 애널리틱스 기능의 성능 문제를 해결하고, 데이터 저장 구조 및 쿼리 최적화 방법을 설명합니다.

머지 리퀘스트 애널리틱스 기능 은 프로젝트에서 머지된 머지 리퀘스트에 대한 통계를 보여주며, 레코드 수준의 메타데이터도 제공합니다. 집계 항목에는 다음이 포함됩니다: 평균 머지 소요 시간 : 생성 시각과 머지 시각 사이의 기간. 월별 집계 : 12개월간 머지된 머지 리퀘스트의 차트. 차트 아래에서 사용자는 페이지당 12개월씩 페이지네이션된 머지 리퀘스트 목록을 볼 수 있습니다. 다음 항목으로 필터링할 수 있습니다: 작성자 담당자 라벨 마일스톤 소스 브랜치 타깃 브랜치 현재 성능 문제 # 집계 쿼리는 추가 디스크 공간이 필요한 특수 인덱스를 요구합니다(인덱스 전용 스캔). 전체 12개월을 조회하면 속도가 느립니다(구문 타임아웃). 대신, 프런트엔드는 월별로 데이터를 요청합니다(데이터베이스 쿼리 12회). 특수 인덱스를 사용하더라도, 머지 리퀘스트 수가 많기 때문에 그룹 수준에서 이 기능을 제공하는 것은 실현하기 어렵습니다. 예시 쿼리 # 특정 월에 머지된 머지 리퀘스트 수를 조회하는 쿼리: SELECT COUNT(*) FROM "merge_requests" INNER JOIN "merge_request_metrics" ON "merge_request_metrics"."merge_request_id" = "merge_requests"."id" WHERE (NOT EXISTS (SELECT 1 FROM "banned_users" WHERE (merge_requests.author_id = banned_users.user_id))) AND "merge_request_metrics"."target_project_id" = 278964 AND "merge_request_metrics"."merged_at" >= '2022-12-01 00:00:00' AND "merge_request_metrics"."merged_at" <= '2023-01-01 00:00:00' merge_request_metrics 테이블은 첫 페이지 로드 시간을 개선하기 위해 target_project_id 를 추가하는 방식으로 역정규화(de-normalized)되었습니다. 이 쿼리 자체는 짧은 날짜 범위에서는 잘 동작하지만, 날짜 범위가 늘어날수록 타임아웃이 발생할 수 있습니다. 추가 필터가 적용되면, merge_requests 테이블도 함께 필터링해야 하므로 쿼리가 더 복잡해집니다: SELECT COUNT(*) FROM "merge_requests" INNER JOIN "merge_request_metrics" ON "merge_request_metrics"."merge_request_id" = "merge_requests"."id" WHERE (NOT EXISTS (SELECT 1 FROM "banned_users" WHERE (merge_requests.author_id = banned_users.user_id))) AND "merge_requests"."author_id" IN (SELECT "users"."id" FROM "users" WHERE (LOWE