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
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 763
3318 cubrid broker의 job_queue 가 궁금합니다 new kubrid 2020.11.30 4
3317 인덱스를 엉뚱한 걸 타고 있습니다??! 9 file Philip Park 2020.11.26 116
3316 show heap 오류.. 5 밤톨이 2020.11.25 42
3315 데이터 업로드 관련 문의입니다. 2 왕왕초보왕왕 2020.11.25 23
3314 2가지 질문 드려도 될까요? 볼륨 자동증가 및 아카이브 로그 질문입니다. 4 덴드로비움 2020.11.24 40
3313 CLOB 관련 문의드립니다. 3 HYHY 2020.11.23 40
3312 DB연계 관련하여 문의 드립니다. 2 uzins 2020.11.23 23
3311 증분백업이 안됩니다. 3 file Philip Park 2020.11.19 39
3310 증분백업이 안됩니다. 15 file Philip Park 2020.11.19 91
3309 큐브리드 8버전 시스템 카탈로그 테이블,컬럼 정보 문의 1 sonoru 2020.11.17 16
3308 맥 빅서 업데이트 이후 문제 3 Seonu 2020.11.17 89
3307 큐브리드 merge into 실행후 return value에 대해 1 딸기맛숩 2020.11.16 24
3306 이러한 오류가 뜨는 이유가 뭔가요? 1 UK 2020.11.13 28
3305 [데이터 가져오기] 테이블 설정이 정상적이지 않습니다. 1 안녕 2020.11.11 24
3304 마이그레이션 툴 사용시 커멘트까지 내보내는 방법이 있나요? 1 워리파파 2020.11.10 21
3303 명령어로 다른 DB 서버에 접속 및 쿼리 1 프리오 2020.11.10 26
3302 cubrid 버전별 EOS 문의 1 큐브라떼 2020.11.10 23
3301 큐브리드 한글 정렬 문의 8 file gjgj 2020.11.10 65
3300 Cannot communicate with the broker or received invalid packet (UNION 사용) 에러 1 도여도여도여도여 2020.11.05 39
3299 큐브리드 브로커 질문드립니다. 1 안녕 2020.11.04 24
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 166 Next
/ 166

Contact Cubrid

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