[조회 성능 10배] 집계 키를 사용하여 조회 실행 시간을 10분의 1로 설정하는 것을 권장합니다.

10961 단어 Snowflake표 디자인
이 글은 Snowflake Advent Calendar 2020 9일째 되는 글이다.
개요
다음은 Snowflake에서 질의의 가지를 자르는 이유(질의를 수행할 때 해석 참조를 건너뛰는 것)의 클러스터 키 사용 방법에 대해 설명합니다.6억장의 음반 서식에 지정된 기간 집계된 조회를 통해 검증한 결과 성능이 약 10배 향상된 것으로 확인됐다.
집계 키를 설정하지 않을 때의 실행 시간을 기준으로 실행 시간 비율을 포함하는 성능 검증 결과는 다음과 같다.가장 좋은 것은 그것을 단열의 집합 키로 지정하는 것이지만, 여러 열을 통해 집합 키로 설정하는 것도 높일 수 있다.
번호 매기기
조치
실행 시간 비율
Partitions scanned
Bytes scanned
1
클러스터 키 설정 없음
1
10863
26.80GB
2
L_SHIPDATE 열에서 클러스터 키 설정하기
10
1241
2.30GB
3
L_SHIPDATE 열이 포함된 다중 열에서 클러스터 키 설정하기
7
1613
3.66GB
결론
자주 사용하는 대규모 공장표에는 사용할 여러 날짜열을 분류열로 설정하는 것이 좋다.그러나 자동 분류는 비용이 필요하기 때문에 다른 주파수로 업데이트된 시계나 잘 사용하지 않는 시계로 설정하면 원가 우위를 고려해야 한다.
문서에서 날짜 열을 설정하는 것이 좋습니다.
  • 선택 필터에서 가장 활발하게 사용되는 그룹입니다.날짜 기반 질의와 관련된 많은 플랜트 테이블(예: WHERE invoice date&x AND 요청일 <=y)의 경우 날짜 열을 선택하는 것이 좋습니다.
  • 참조 소스: https://docs.snowflake.com/ja/user-guide/tables-clustering-keys.html#strategies-for-selecting-clustering-keys
    클러스터 키
    클러스터 키는
    문서에는 다음과 같은 설명이 있습니다.
    분류 키는 같은 미분구 내의 표에 데이터를 공존할 수 있도록 명확하게 지정된 표(또는 표의 표현식)의 열 서브집합이다.
    참조 소스: https://docs.snowflake.com/ja/user-guide/tables-clustering-keys.html#what-is-a-clustering-key
    클러스터 키 유지 관리
    아래 문서에서 말한 바와 같이, 분류 키의 유지보수는 자동으로 진행됩니다.
    자동 클러스터
    "AUTOMATIC CLUSTERING"으로 유료화됩니다.

    또 수동 집합을 실시할 수 없을 것 같다.
    2020년 5월까지 수동 재집계는 모든 계좌에서 폐지됐다.
    참조 소스: 수동 재집합 클래스 - 권장되지 않음 - Snowflak Doocumentation
    검증 방법
    1. 검증 데이터베이스와 표 만들기
    CREATE OR REPLACE DATABASE WK_PRUNING_TEST;
    
    USE WK_PRUNING_TEST;
    Create or replace table LINEITEM (
      L_ORDERKEY    NUMBER(38,0)
      ,L_PARTKEY    NUMBER(38,0)
      ,L_SUPPKEY    NUMBER(38,0)
      ,L_LINENUMBER NUMBER(38,0)
      ,L_QUANTITY   NUMBER(12,2)
      ,L_EXTENDEDPRICE  NUMBER(12,2)
      ,L_DISCOUNT   NUMBER(12,2)
      ,L_TAX    NUMBER(12,2)
      ,L_RETURNFLAG VARCHAR(255)
      ,L_LINESTATUS VARCHAR(255)
      ,L_SHIPDATE   DATE
      ,L_COMMITDATE DATE
      ,L_RECEIPTDATE    DATE
      ,L_SHIPINSTRUCT   VARCHAR(255)
      ,L_SHIPMODE   VARCHAR(255)
      ,L_COMMENT    VARCHAR(255)
    );
    
    /*
    --下記コードは本番環境で実施しないようにしてください。
    --検証のために、リザルトキャッシュ機能をオフにします。
    use role accountadmin;
    ALTER ACCOUNT SET USE_CACHED_RESULT = FALSE;
    SHOW PARAMETERS LIKE '%USE_CACHED_RESULT%'
    
    --検証完了後、リザルトキャッシュ機能をオンにします。
    use role accountadmin;
    ALTER ACCOUNT SET USE_CACHED_RESULT = TRUE;
    SHOW PARAMETERS LIKE '%USE_CACHED_RESULT%'
    */
    
    2. 샘플 데이터 가져오기
    USE WK_PRUNING_TEST;
    TRUNCATE TABLE LINEITEM;
    INSERT INTO LINEITEM
    SELECT 
        *
        FROM 
            "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1000"."LINEITEM";
    
    -- 5,999,989,709であることを確認
    SELECT COUNT(*) FROM LINEITEM
    
    3. 인증서 작성
    CREATE OR REPLACE TABLE LINEITEM_CLONE_1 CLONE LINEITEM;
    CREATE OR REPLACE TABLE LINEITEM_CLONE_2 CLONE LINEITEM;
    
    4. 검증표 1의 LSHIPDATE 열에서 클러스터 키 설정하기
    ALTER TABLE "PUBLIC"."LINEITEM_CLONE_1" CLUSTER BY (L_SHIPDATE);
    
    --cluster_by列が、LINEAR(L_SHIPDATE)となっていることを確認
    show tables like 'LINEITEM_CLONE_1'; 
    
    5. 검증표 2의 LCOMMITDATE 열, LCOMMITDATE 열, LSHIPDATE 열에서 클러스터 키 설정하기
    /*
    --カーディナリティチェック
    --Docsより、"低いカーディナリティ列の前に高いカーディナリティ列を配置すると、後者の列でのクラスタリングの有効性が低下します。"との記載あり
    SELECT
        approx_count_distinct(L_SHIPDATE)
        ,approx_count_distinct(L_COMMITDATE)
        ,approx_count_distinct(L_COMMITDATE)
        FROM LINEITEM
    ;
    */
    ALTER TABLE "PUBLIC"."LINEITEM_CLONE_2" CLUSTER BY (L_COMMITDATE,L_COMMITDATE,L_SHIPDATE) ;
    
    --cluster_by列が、LINEAR(L_COMMITDATE,L_COMMITDATE,L_SHIPDATE)となっていることを確認
    show tables like 'LINEITEM_CLONE_2';
    
    6. 자동 재집계 복구, 잠시 기다리면 검증 조회 수행
    SELECT
        SUM(L_EXTENDEDPRICE)
        FROM 
            "PUBLIC"."LINEITEM"
        WHERE L_SHIPDATE >= '1998-01-01'
    ;
    
    SELECT
        SUM(L_EXTENDEDPRICE)
        FROM 
            "PUBLIC"."LINEITEM_CLONE_1"
        WHERE L_SHIPDATE >= '1998-01-01'
    ;
    
    
    SELECT
        SUM(L_EXTENDEDPRICE)
        FROM 
            "PUBLIC"."LINEITEM_CLONE_2"
        WHERE L_SHIPDATE >= '1998-01-01'
    ;
    
    7. History 탭에서 질의의 실행 결과 확인

    참조 링크
  • How To: Recognize Unsatisfactory Pruning (snowflake.com)
  • 좋은 웹페이지 즐겨찾기