Background Image

FORUM

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
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



감사합니다.

  • ?
    엄기호 2020.10.23 16:38
    큐브리드를 이용해주셔서 감사드립니다.
    - 동시에 다수 사용자 및 연계 에이전트 등 여러 CLIENT 가 접속하여 DB에 상당한 부하 발생할 것으로 예상되는 상황입니다.
    - 검색 엔진을 위한 조회용 VIEW 쿼리에 아래처럼 집계 함수인 GROUP_CONCAT를 사용하는 것을 고려하고 있습니다.
    (1) A 테이블의 각 행을 조회하면서, 그에 해당하는 부가 정보를 아래처럼 수집합니다.
    (2) 동시에 B 테이블의 여러 행의 특정 필드를 하나의 값으로 연결하고, (B 테이블 1~2개 필드에 대해, index 생성예정)
    (3) 동시에 C 테이블의 여러 행의 특정 필드를 하나의 값으로 연결하여 얻기 원함 (C 테이블 1~2개 필드에 대해, index 생성예정)
    ==> 이부분에 대해서 명확하게 알 수 없습니다.
    예시를 주신다면 예시에 따른 답변을 해드리겠습니다.
  • ?
    인혁 2020.10.23 18:28
    우선 답변 감사드립니다.
    - 다수 사용자
    => 불특정 다수로서 WAS 를 통해 접속하는 실 사용자를 의미합니다.
    (이번 사업에서는 실제 최대 1만명 정도 사용자 대상으로 서비스 하며, 실제 동시 사용자는 아직 알 수 없습니다.)

    - 연계 에이전트 등 여러 CLIENT
    => 아래처럼 여러가지 연계가 발생합니다. (쿼리 대상이 DB1이라 할 경우)
    (1) 외부 기관이 제공하는 Open API를 호출하여 결과를 DB1에 적재
    (2) WAS를 이용해 다른 DBMS의 데이터 SELECT하여 CUBRID DB1 에 적재
    (3) cubridSyncApplyer 등 동기화모듈을 이용하여 망간 DB1<-> DB2연계

    - 검색 엔진을 위한 조회용 VIEW 쿼리에 집계 함수인 GROUP_CONCAT을 사용
    조회 대상인 주 테이블(검색 단위) : A입니다.
    A와 B 의 관계는 foreign key 를 이용하여 1:N 관계입니다.
    B와 C 의 관계는 foreign key 를 이용하여 1:N 관계입니다.
    => 결과적으로 A : B: C 는 1:N:M 관계입니다.
    A, B, C를 연관짓는 필드는 PK 및 FK이므로 index가 생성되게 됩니다.
    A에 대한 부가정보가 B와 C에 존재하기 때문에 한번에 함께 불러오기를 원하는 것입니다.

    설명이 되셨는지 확인 부탁드립니다.
    고맙습니다.
  • ?
    인혁 2020.10.23 18:31
    이번 사업에 CUBRID 측 기술 지원 담당하시는 부장님께 직접 유선 통화를 통해 받은 답변을 참조로 남겨드립니다.

    1. 설명한 예에서 A 테이블에 대한 B 테이블, C 테이블의 데이터가 100여행 정도를 연결하는 것은 상관없음
    - 이전에 문제 있었던 다른 사업에서는 GROUP_CONCAT 속도가 늦을 수 있으니 피하라고 권고했던 것으로 보임
    - 질의문이 응용에서 SELECT만 해서 가져가면 큰 무리 없음 (SELECT & INSERT 동시 TRANSACTION 아니므로)
    - 검색엔진의 업무 자체가 BATCH 성으로 돈다면 큰 문제 없을 것임

    2. GROUP_CONCAT 권장하지 않는 경우:
    - 실시간 응답을 필요로 하는 경우 (검색엔진은 배치성으로 가져가므로 해당되지 않음)
    - 결과를 받는 시간이 지연되지 않아야 하는 경우
    - GROUP_CONCAT 대상이 수천만 정도의 대량 데이터인 경우
    - 몇천만 ~ 억 건 단위 정도 테이블 자기 자신에 대해서 GROUP_CONCAT을 사용한다면 부하가 됨
    1) GROUP_CONCAT 은 보통 CONNECT BY ... START WITH 및 GROUP BY 등과 함께 집계를 위해 쓰게 됨
    2) CUBRID 특성이 CONNECT BY 가 느림
    3) 처리를 위해 내부적으로 temp 테이블이 생성이 되어서 정렬 등이 일어남
    4) 이때 FULL SCAN으로 동작되어 속도가 늦어질 수 있므므로 느려짐
    5) 그래서 이전 사업에서는 GROUP_CONCAT을 지양하기를 권고했던 것으로 보임

    3. GROUP_CONCAT 과 엔진이 뻗는 CORE 문제와의 관계
    - GROUP_CONCAT 부하 때문에 CORE 발생하지는 않음
    - XX시 등 엔진 10.2를 쓰는데 9.2 버전 대비
    1) 속도도 20~30% 정도 향상되었고
    2) 자잘한 버그도 많이 잡았음
    - 만약 버그 때문에 CORE 문제가 발생했다면 보통 GROUP_CONCAT 문제가 아니라 보통 아래 이유 때문에 발생함
    1) OUT OF MEMORY
    2) 메모리 참조 에러
    - 버그 때문에 엔진이 뻗었다면 그건 이미 작업(보완)이 되었을 것임

    다른 조언 있으시면 얼마든지 말씀 부탁드립니다.

    고맙습니다.
  • ?
    정만영 2020.10.26 16:43
    문의한 내용으로 모든 사항을 알 수 없지만, group_concat 성능문제가 아닌 뷰테이블 또는 인라이뷰에서 where절 데이터
    필터 조건이 없거나 좋지 않아서 조인 처리하는 뷰테이블(원본 테이블)과 전체 데이터를 조인하면서 성능 및 DB부하가 발생한 보입니다.
    우선 /*+ use_merge */ 힌트를 추가해 질의성능을 비교해 보시고 뷰테이블(인라인뷰) 날짜-컬럼등으로 부분검색이 가능한지 질의를 검토해 보시기 바랍니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 admin 2024.04.23 33
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4458
3833 Cubrid DB 서버 swap memory 사용률 관련 질의 1 오라클민 2023.04.12 221
3832 Mac OS 큐브리드 매니저 실행이 안 됩니다. 2 아데산야라이트훅 2023.04.07 148
3831 blob select 1 네오랜덤 2023.04.05 139
3830 dba권한 상속 1 네오랜덤 2023.04.05 84
3829 mac os m1 실행시 무응답 실행안됩니다. 6 시나몬빵 2023.04.04 154
3828 함수/프로시져 구동시 필요한 java버젼 1 네오랜덤 2023.03.31 123
3827 큐브리드 설치 도중 취소한 후, 재설치가 불가능합니다. 5 복괴 2023.03.28 154
3826 where in () 서브쿼리 관련 문의입니다 1 제리리 2023.03.27 114
3825 한글을 입력받아 한글을 리턴하는 CUBRID JAVA StoredProcedure 작성시 window 환경에서 리턴 값이 깨져서 출력 됨 2 두목원슝 2023.03.22 164
3824 큐브리드 DAMO(암호화)관련 버전 호환관련하여 문의드립니다. 3 초코초코초 2023.03.20 230
3823 cubrid manager 에러?? 3 11시38분 2023.03.20 223
3822 PreparedStatement.executeBatch에서 일부 데이터의 오류 시 반환 값 문의 2 새옹지마 2023.03.18 341
3821 db생성경로가 db테이블과 결과조회에 영향을 미치나요? 1 dfdfdd 2023.03.15 120
3820 SQL statement violated NOT NULL constraint 1 yoo 2023.03.15 164
3819 콤마로 split하는 기능 구현 관련 문의 5 플레이어블 2023.03.15 302
3818 insert문에서 replace 1 yoo 2023.03.15 123
3817 cubrid 파라미터 바인딩 3 DJ 2023.03.14 167
3816 /home/jenkins/workspace/cubrid_release_10.1/src/transaction/boot_cl.c, line 1138 CODE = -971 Tran = -1, EID = 1Program 'tranlist' (pid ) connected to database server 'test' on the host 'localhost' 4 jmkim 2023.03.13 195
3815 macOS CUBRID 다운로드 질문 1 bk9395 2023.03.13 195
3814 CUBRID 11.2 & CUBRID Aadmin 11.1 오류 문의 2 file 붉은구름 2023.03.08 135
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 200 Next
/ 200

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales