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 4256
3976 schema 파일 loaddb - 스키마 정보 중복오류 문의 4 daay 2024.03.21 54
3975 object to string 4 네오랜덤 2024.03.20 44
3974 mysql로 DB연동 문의 2 연동테스트용 2024.03.20 39
3973 특정DB만 접근 시간이 현저하게 오래 걸리는 문제 1 file 그로구 2024.03.20 33
3972 jdbc 연동시의 charset 강제 변경 방법 1 file gwak 2024.03.14 34
3971 도커로 HA환경 구성 테스트중 hb start.. 1 wodud0170 2024.03.12 43
3970 이중화 관련 문의드립니다. 1 adqwdqwd123412 2024.03.12 42
3969 큐브리드 마스터 복제 관련 문의 드립니다. 2 이지혜 2024.03.11 40
3968 큐브리드 다운로드 에러 1 file 나래아빠 2024.03.08 63
3967 CUBRID Migration Toolkit "orai18n.jar" 추가 방법 1 가을이아빠 2024.03.07 43
3966 CUBRID 에러 로그 관련 확인 요청 2 jnj570244 2024.03.07 78
3965 DB링크로 조회시 문자타입이 조회되지 않고 있습니다. 2 file 원샷 2024.03.06 68
3964 다른 사용자 계정에서 csql로 localhost 접근 문제 4 가을이아빠 2024.03.05 67
3963 [성능이슈] 큐브리드 함수 사용으로 인한 성능이슈 3 레고 2024.03.04 94
3962 CUBRID 11.2 rpm 설치시 cubrid 계정 패스워드 2 가을이아빠 2024.03.04 46
3961 Cubrid JDBC 버전에 따라 출력되는 결과가 다릅니다. 1 엘L 2024.02.28 73
3960 select 질의문 문의 2 태리 2024.02.26 102
3959 cubrid statdump 기술 문의드립니다. 5 secret 이건우 2024.02.19 11
3958 날짜 형식 변환에 대해서 궁금해서 올립니다. 1 김용용 2024.02.14 46
3957 컬럼의 Enum DataType 가져오는것 문의 3 엘L 2024.01.30 65
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 199 Next
/ 199

Contact Cubrid

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