로드된 데이터는 플랫 테이블로 구성됩니다. 이 테이블에는 행과 필드가 있으며 모든 필드에는 동일한 수의 행이 있습니다. 모든 값은 Qlik Indexing(QIX) 엔진에 의해 이중 값으로 저장됩니다.
로드된 각 필드의 고유 값은 기호 테이블로 수집됩니다. 필드당 하나의 기호 테이블이 있으며 각 기호 테이블에는 각 고유 값에 할당된 포인터 값이 있습니다. 포인터는 각 기호 테이블 내에서 고유하지만 모든 기호 테이블에서 고유하지는 않습니다. Qlik Sense는 기호 테이블당 최대 20억(2^31) 기호로 제한됩니다.
값의 구별성은 이중 값의 기본 숫자 값을 기반으로 합니다. 이것은 다른 텍스트 값을 가진 이중 값을 의미하지만 동일한 숫자 값은 동일한 기호로 표시됩니다.
포인터 값은 비트로 채워져 있습니다. 즉, 기호 테이블의 행 수를 나타내는 데 필요한 만큼의 비트만 가집니다. 예를 들어, 4개의 개별 값이 있는 필드에는 4개의(2^2) 값을 나타내는 데 필요한 비트 수인 2비트 길이의 포인터가 필요합니다. 아래 그림에서 포인터는 이진 값으로 표시됩니다.
기호 테이블은 필드의 고유한 값을 표시하므로 목록 상자에 필드를 표시하여 시각화할 수 있습니다.
메모리 내 데이터 테이블은 실제 로드된 값을 저장하지 않습니다. 데이터 테이블에서 값은 포인터 값으로 대체됩니다. 포인터가 실제 데이터 값보다 몇 배 더 짧기 때문에 상당한 데이터 압축이 가능합니다. 실제 데이터 값에 비해 처리할 비트가 적기 때문에 포인터 값을 통해 데이터를 여러 번 빠르게 처리할 수 있습니다.
Symbol Tables and Bit-Stuffed Pointers
Qlik Sense 및 QlikView 스크립트가 실행되는 동안 각 load 문 후에 Qlik 엔진은 로드된 데이터를 두 가지 테이블 유형(하나의 데이터 테이블과 여러 기호 테이블)으로 변환합니다. 엔진은 필드당 하나의 기호 테이블을 생성합니다.
기호 테이블에는 필드의 고유 값당 하나의 행이 포함됩니다. 각 행에는 포인터와 필드 값, 숫자 값과 텍스트 구성 요소가 모두 포함되어 있습니다. 기본적으로 기호 테이블은 필드 값에 대한 조회 테이블입니다.
데이터 테이블은 "내부 테이블 보기"를 선택했을 때 QlikView 내부 테이블 뷰어(<CTRL>-T)에서 볼 수 있는 것과 동일한 테이블입니다. 동일한 행 수와 동일한 수의 열입니다. 그러나 테이블에는 데이터 자체가 포함되어 있지 않으며 포인터만 포함되어 있습니다. 그러나 포인터를 사용하여 기호 테이블의 실제 값을 찾을 수 있으므로 정보가 손실되지 않습니다.
이 포인터는 일반적인 포인터가 아닙니다. 이는 비트로 채워진 인덱스입니다. 즉, 필드를 나타내는 데 필요한 만큼만 비트를 가질 수 있으며 그 이상은 가질 수 없습니다. 따라서 필드에 4개의 개별 값이 포함된 경우 인덱스 길이는 2비트에 불과합니다. 이는 4개의 값을 나타내는 데 필요한 비트 수이기 때문입니다. 따라서 데이터 테이블은 그렇지 않은 경우보다 훨씬 작아집니다.
비트가 포함된 포인터와 기호 테이블은 Qlik 엔진이 가능한 방식으로 데이터를 압축할 수 있는 이유입니다.
이를 이해하면 문서를 최적화하는 데 도움이 됩니다. 테이블의 레코드 수와 열 수가 사용되는 메모리 양에 영향을 미치는 것은 분명하지만 다른 요소도 있습니다.
- 기호의 길이는 기호 테이블의 크기에 영향을 미칩니다.
- 필드의 고유 값 수는 기호 테이블의 행 수와 포인터 길이에 영향을 미칩니다.
Qlik 스크립트를 생성할 때 이러한 숫자를 줄여 메모리 사용량을 최소화할 수 있는 방법이 있는지 항상 자문해 보십시오. 다음은 몇 가지 일반적인 경우입니다.
표시할 필요가 없는 길고 연결된 복합 키가 있습니다. Autonumber()를 사용하면 기호는 기호 테이블에서 공간을 차지하지 않습니다. 대신 정수 값은 암시적으로 계산됩니다.
예:
판매일자&판매점&순번 As 판매번호
AutoNumber(판매일자&판매점&순번) As 판매번호
판매번호 필드는 판매전표의 유니크한 키 역할을 합니다. 판매번호필드의 값을 가공할 필요가 없을 경우 AutoNumber() 함수를 이용하여 고유 정수 값으로 변환함으로써 필드의 길이를 짧게 만들 수 있습니다.
고유한 타임스탬프가 많은 필드가 있습니다. 그런 다음 먼저 날짜와 시간이라는 두 개의 필드로 나누고 시간을 가장 가까운 15초 간격이나 가장 가까운 1분으로 반올림하는 것이 더 나을 때도 있습니다.
예:
Date(Floor(Timestamp)) as Date,
Time(Floor(Frac(Timestamp),1/24/60)) as Time,
이러한 표현식은 최대 24*60=1440개의 고유 시간 값(11비트)과 일반적으로 365개의 고유 날짜(9비트)를 제공합니다. 즉, 1백만(20비트) 이상의 고유 값이 있는 타임스탬프 필드가 있으면 타임스탬프 필드에 대한 포인터는 두 개별 필드에 대한 포인터보다 더 많은 공간을 차지합니다. 그리고 기호 테이블의 행 수에 대해 훨씬 더 빨리 손익분기점에 도달합니다. 따라서 약 100,000개의 개별 값이 있을 때 더 빨리 두 개의 필드로 분할하는 것을 고려해야 합니다.
For more information
https://qliksense.tistory.com/
Qliker
'Qlik Sense' 카테고리의 다른 글
클릭센스 2024 Feb 새로운 기능 (2) | 2024.03.19 |
---|---|
클릭센스 리포지토리 PostgreSQL Upgrade (1) | 2023.09.24 |
데이터 프로파일링 구축 사례 (0) | 2023.09.17 |
시각화 도구 평가를 위한 효과적인 단계 (0) | 2023.09.13 |
클릭센스 Aug 2023 새로운 기능 (1) | 2023.09.10 |