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 */ 힌트를 추가해 질의성능을 비교해 보시고 뷰테이블(인라인뷰) 날짜-컬럼등으로 부분검색이 가능한지 질의를 검토해 보시기 바랍니다.

  1. SQLGate for CUBRID 영구 무료 라이선스 제공

    Date2020.04.09 Byadmin Views4444
    read more
  2. 조회쿼리 시간단축

    Date2023.06.30 Byleeee Views98
    Read More
  3. CUBRID 8.4.4 -> 11.0.3 로 업그레이드 시 발생할 문제가 있을까요?

    Date2023.06.29 BySDDC사업개발자 Views89
    Read More
  4. CUBRID to Tibero DBLink지원 가능한지 알고싶습니다.

    Date2023.06.28 By공공기관에서사용중1 Views137
    Read More
  5. ELO타입이 무엇인가요?

    Date2023.06.27 Bysobubble Views116
    Read More
  6. 백업파일 받았는데 복구하는 방법을 모르겠습니다.

    Date2023.06.20 ByGgyak Views182
    Read More
  7. UTF8 한글이 깨짐

    Date2023.06.19 Byyonggi Views270
    Read More
  8. 저장 프로스저에 있는 함수 상세보기 문의입니다.

    Date2023.06.12 By대출인생30년 Views82
    Read More
  9. MERGE INTO 속도 개선 문의

    Date2023.06.12 Byleeee Views129
    Read More
  10. NX_transcation

    Date2023.06.12 Byyoo Views79
    Read More
  11. cubrid cursor.close() 에러 관련질문

    Date2023.06.08 By힘내자화이팅 Views185
    Read More
  12. merge 쿼리 속도개선

    Date2023.06.08 Byleeee Views109
    Read More
  13. 브로커(CAS)수 질문드립니다!

    Date2023.06.05 By요시니 Views152
    Read More
  14. 데이터 이관 문의입니다.

    Date2023.05.30 Bykipo0821 Views129
    Read More
  15. 8.4.4 charset. Collation 확인 방법

    Date2023.05.24 By네오랜덤 Views185
    Read More
  16. 8.4.4버젼 charset 확인

    Date2023.05.23 By네오랜덤 Views190
    Read More
  17. 쿼리 속도 차이 질문

    Date2023.05.18 By하얀미스 Views142
    Read More
  18. spring boot 에서 HikariPool-1 - Driver does not support get/set network timeout for connections. (java.lang.UnsupportedOperationException) 질문 드립니다.

    Date2023.05.18 Bykjaminam Views768
    Read More
  19. cci 프로그래밍에서 DB LINK 관련 문의

    Date2023.05.18 Byjjune1206 Views127
    Read More
  20. 큐브리드 매니저 실행이 오류

    Date2023.05.18 By청주시청 Views101
    Read More
  21. ddl 추출

    Date2023.05.17 By네오랜덤 Views104
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 200 Next
/ 200

Contact Cubrid

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