현재 구축 중인 사이트에 GROUP_CONCAT 쿼리 최적화 관련 문의드립니다

by 인혁 posted Oct 21, 2020

* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
OS
RHEL 7.8
CUBRID Ver.
10.2.1
CUBRID TOOL Ver.
상응하는 JDBC 드라이버 사용
응용 환경(API)
JDBC

* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축


-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------


현재 구축 중인 사이트에 GROUP_CONCAT 쿼리 최적화 관련 문의드립니다.


- 동시에 다수 사용자 및 연계 에이전트 등 여러 CLIENT 가 접속하여 DB에 상당한 부하 발생할 것으로 예상되는 상황입니다.

- 검색 엔진을 위한 조회용 VIEW 쿼리에 아래처럼 집계 함수인 GROUP_CONCAT를 사용하는 것을 고려하고 있습니다.

(1) A 테이블의 각 행을 조회하면서, 그에 해당하는 부가 정보를 아래처럼 수집합니다. 

(2) 동시에 B 테이블의 여러 행의 특정 필드를 하나의 값으로 연결하고, (B 테이블 1~2개 필드에 대해, index 생성예정)

(3) 동시에 C 테이블의 여러 행의 특정 필드를 하나의 값으로 연결하여 얻기 원함 (C 테이블 1~2개 필드에 대해, index 생성예정)

- 그런데 GROUP_CONCAT 함수가 DBMS에 일으키는 부하가 상당하다는 의견이 있어서 여러 대안을 고려 중입니다.

- CUBRID 버전 : 10.2.1


GROUP_CONCAT 대신할 대응방안

1. JOIN 문을 쓸 경우 (A JOIN B JOIN C)

- 하나의 컬럼 값으로 연결하는 대신에 값 개수만큼 행 수가 증가함

- 결과를 조회하는 애플리케이션 측에서 전체 값을 다 가져간 후에, 애플리케이션 내부에서 GROUP_CONCAT 역할을 하는 로직을 별도 구현하는 방식

- 이렇게 하면 가져와야 하는 row 수는 많아지겠지만, DB 부하는 줄어드는지 궁금합니다.


2. 그룹별 연결할 값을 제한할 경우 (모든 값을 연결하기를 포기함)

- GROUP_CONCAT 함수 자체는 집계 대상 행 전체에 대해 수행하며, 범위는 변경할 수 없는 것으로 이해됩니다.

- 여러 값을 합칠 개수를 적절히 제한하는 방안

(1) 1건씩 조회 (예를 들면 select 필드에 B 테이블 및 C 테이블에 대한 subquery 구현 limit 1)

(2) 2건 이상 조회 (예를 들면 select 필드에 저장 함수 등을 직접 구현하여 사용)

- 이렇게 하면 GROUP_CONCAT 또는 1번안의 JOIN을 사용하는 것보다 DBMS에 가해지는 부하가 줄어들까요?


3. 다른 좋은 방안이 있을지 조언 부탁드립니다.



* 거의 유사한 환경의 이전 다른 사업에서 DB 부하 문제로 DB가 뻗었던 적이 있습니다. 

그때 CUBRID 엔지니어 상담했을 때에, 

- GROUP_CONCAT 함수가 많은 부하를 일으킨다는 설명과 함께 사용 자제를 권고받았습니다.

- 그래서 GROUP_CONCAT 함수는 제거하였음 (위의 2번안을 택했었습니다.)

- 당시 CUBRID 버전 : 9.2



감사합니다.


Articles

21 22 23 24 25 26 27 28 29 30