日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

文檔

Hologres索引入門

更新時間:

本文為您介紹Hologres中的關鍵索引,如Distribution Key、Event Time Column(Segment Key)和Clustering Key,幫助您在Hologres開發過程中快速上手使用索引,提升查詢性能。

分布式數據倉庫Hologres基本運行原理

Hologres是一個分布式數據倉庫,采用并行計算和向量計算技術實現秒級查詢響應,因此數據的分布特征對性能有關鍵影響,包括數據在多個分布式節點間的分布均衡性(distribution_key),以及單個節點內文件之間的分布有序性(event_time_column/segment_key)。同時Hologres在OLAP場景默認使用列存儲格式,因此數據在文件內的有序性(clustering_key)也至關重要。掌握這三個概念,在性能優化時可以事半功倍。由于數據分布特征是在數據寫入時確定,調整成本高,因此建議在建表時,設計與數據布局相關的三個屬性。而與數據布局無直接關聯的屬性,如位圖索引(bitmap_columns),字典編碼(dictionary_columns)等,可以在建表之后,按需調整。

同時Hologres的元數據采用三級結構Database>Schema>Table,建議邏輯相關的表內聚在Schema下,避免跨庫查詢。Database是元數據隔離的基本單位,不是資源隔離的單位。

SQL優化的基本原理:減少IO,優化并發

建表時設計合適的數據分布,能夠使SQL在執行時快速命中數據,減少IO消耗,以更少的計算資源,實現更高的查詢性能,同時均衡的數據分布也使得并發資源可以充分發揮,避免單點瓶頸。下圖是一個SQL從發起到獲取數據的執行流程,可以通過下圖理解減少IO的流程。image

  • 分區剪枝(Partition Pruning):SQL執行時,對于目標分區表,會通過分區裁剪,定位到所在分區。如果查詢條件和分區不匹配,需要遍歷所有分區,會引起過多的IO掃描,通常分區選擇日粒度比較合適。對于非分區表直接略過,不進行分區裁剪。

  • 分片剪枝(Shard Pruning):通過分布鍵(distribution_key)快速定位到數據所在的數據分片,可以減少單個SQL執行時的資源消耗,對于并發SQL,滿足更高的吞吐能力;如果無法定位到某個分片,會通過分布式框架調度所有的分片參與計算,單個SQL的并行度更高,資源使用更多,但并發能力會降低,部分需要集中化執行的算子會帶來額外的Shuffle開銷。通常分布鍵選擇訂單ID、用戶ID、事件ID等分布比較均衡的字段,多個需要JOIN的表使用相同的分布鍵,可以使相關的數據分片到同一個Shard,通過Local JOIN實現更高的JOIN效率。

  • 文件剪枝(Segment Key Pruning):通過分段鍵(event_time_column/segment_key),快速定位到單個節點內部多個文件中的數據所在文件位置,避免打開不需要訪問的文件。如果無法過濾,則需要遍歷所有的文件。

  • 聚簇剪枝(Clustering Key Pruning):通過聚簇鍵(clustering_key),快速定位單個文件內部的數據段,提高范圍查詢和字段排序的效率。

SQL優化實踐

此處以TPC-H的部分Query為例,為您介紹如何設置Hologres的索引,以獲得更好的查詢性能。關于TPC-H的詳細介紹,請參見測試方案介紹

TPCH SQL參考實踐

TPC-H Q1 Query

TPC-H Q1主要是對lineitem表的部分字段做聚合查詢和過濾篩選。其中:

l_shipdate <= :過濾查詢。需要設置索引以支持范圍過濾,可快速過濾出所需數據。

--TPC-H Q1
SELECT
        l_returnflag,
        l_linestatus,
        SUM(l_quantity) AS sum_qty,
        SUM(l_extendedprice) AS sum_base_price,
        SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
        SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
        AVG(l_quantity) AS avg_qty,
        AVG(l_extendedprice) AS avg_price,
        AVG(l_discount) AS avg_disc,
        COUNT(*) AS count_order
FROM
        lineitem
WHERE
        l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
        l_returnflag,
        l_linestatus
ORDER BY
        l_returnflag,
        l_linestatus;

TPC-H Q4 Query

TPC-H Q4主要是對lineitem和orders表進行關聯查詢。其中:

  • o_orderdate >= DATE '1996-07-01':過濾查詢。需要設置索引以支持范圍過濾,可快速過濾出所需數據。

  • l_orderkey = o_orderkey:兩表JOIN。需要為兩個表設置同一個索引,最好能進行Local JOIN,以減少數據在兩表交互時的Shuffle操作。

    --TPC-H Q4 Query
    SELECT
            o_orderpriority,
            COUNT(*) AS order_count
    FROM
            orders
    WHERE
            o_orderdate >= DATE '1996-07-01'
            AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH
            AND EXISTS (
                    SELECT
                            *
                    FROM
                            lineitem
                    WHERE
                            l_orderkey = o_orderkey
                            AND l_commitdate < l_receiptdate
            )
    GROUP BY
            o_orderpriority
    ORDER BY
            o_orderpriority;

建表建議

在上述的Q1和Q4查詢中,主要涉及lineitem和orders兩張表,分別如下:

hologres_dataset_tpch_100g.lineitem

Q1和Q4中均涉及對lineitem表的查詢,其中使用的字段和查詢條件不同。

  • 對于Q1 Query:主要用l_shipdate做范圍過濾篩選。clustering_key可以利用文件內的有序性加速范圍過濾,因此我們可將l_shipdate設置為Clustering Key。segment_key(event_time_column)用于保持文件間的有序性,對于單調遞增/遞減的日期字段,也建議設置為Segment Key,可以有效進行文件層過濾,因此也可將l_shipdate設置為Segment Key。

  • 對于Q4 Query :主要用lineitem表的l_orderkey字段與orders表的o_orderkey字段進行關聯查詢(JOIN)。distribution_key用于指定數據的分布策略,系統會根據distribution_key,將相同的數據存放在同一個Shard上,當兩張表在同一個Table Group內,并且JOIN的字段是Distribution Key時,在進行數據寫入時,會自動將兩張表重相同Key的記錄分發到同一個Shard上,當表進行JOIN時,只需要在當前節點進行Local JOIN,無需按照JOIN Key進行數據Shuffle,避免了運行時數據打散和重分發,可以顯著提高執行效率。因此,我們將l_orderkey設置為Distribution Key。

  • 最終lineitem表的表結構如下:

    BEGIN;
    CREATE TABLE hologres_dataset_tpch_100g.lineitem
    (
        l_ORDERKEY      BIGINT      NOT NULL,
        L_PARTKEY       INT         NOT NULL,
        L_SUPPKEY       INT         NOT NULL,
        L_LINENUMBER    INT         NOT NULL,
        L_QUANTITY      DECIMAL(15,2) NOT NULL,
        L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
        L_DISCOUNT      DECIMAL(15,2) NOT NULL,
        L_TAX           DECIMAL(15,2) NOT NULL,
        L_RETURNFLAG    TEXT        NOT NULL,
        L_LINESTATUS    TEXT        NOT NULL,
        L_SHIPDATE      TIMESTAMPTZ NOT NULL,
        L_COMMITDATE    TIMESTAMPTZ NOT NULL,
        L_RECEIPTDATE   TIMESTAMPTZ NOT NULL,
        L_SHIPINSTRUCT  TEXT        NOT NULL,
        L_SHIPMODE      TEXT        NOT NULL,
        L_COMMENT       TEXT        NOT NULL,
        PRIMARY KEY (L_ORDERKEY,L_LINENUMBER)
    )
    WITH (
        distribution_key = 'L_ORDERKEY',--在join時可以實現local join
        clustering_key = 'L_SHIPDATE',--加速范圍過濾
        event_time_column = 'L_SHIPDATE'--加速文件裁剪
      );
    COMMIT;

hologres_dataset_tpch_100g.orders

本示例中,orders表參與Q4 Query的計算。

  • 將orders表的o_orderkey字段設置為Distribution Key,可有效利用Local JOIN的能力,提升關聯(JOIN)查詢的效率。

  • o_orderdate字段主要用于日期字段的過濾查詢,所以將其設置為Segment Key,加速文件的裁剪。

  • 最終orders表的表結構如下:

    BEGIN;
    CREATE TABLE hologres_dataset_tpch_100g.orders
    (
        O_ORDERKEY      BIGINT      NOT NULL PRIMARY KEY,
        O_CUSTKEY       INT         NOT NULL,
        O_ORDERSTATUS   TEXT        NOT NULL,
        O_TOTALPRICE    DECIMAL(15,2) NOT NULL,
        O_ORDERDATE     timestamptz NOT NULL,
        O_ORDERPRIORITY TEXT        NOT NULL,
        O_CLERK         TEXT        NOT NULL,
        O_SHIPPRIORITY  INT         NOT NULL,
        O_COMMENT       TEXT        NOT NULL
    )
    WITH (
        distribution_key = 'O_ORDERKEY',--在join時可以實現local join
        event_time_column = 'O_ORDERDATE'--加速文件裁剪
      );
    COMMIT;

樣例數據導入

通過HoloWeb一鍵導入公共數據集功能,將TPC-H 100 GB的數據快速導入至Hologres實例中,詳情請參見一鍵導入公共數據集image

性能測試結果對比

為表設置了合適的屬性(索引)后,測試優化前后的性能結果。

  • 測試環境

    • 實例規格:32 Core。

    • 網絡類型:VPC網絡。

    • 使用PSQL客戶端執行兩次Query,取第二次執行的時間。

  • 測試結論

    • 對于單表的過濾查詢,將過濾字段設置為Clustering Key,可以有效加速查詢。

    • 對于多表關聯的查詢,將JOIN字段設置為Distribution Key,可以顯著加速JOIN效率。

    Query

    Hologres設置索引的Latency

    Hologres未設置任何索引的Latency

    Q1

    48.293 ms

    59.483 ms

    Q4

    822.389 ms

    3027.957 ms

附錄資料參考

閱讀更多

技術原理篇

Hologres技術原理揭秘(架構、存儲引擎、計算引擎等核心原理揭秘):阿里巴巴云原生實時數倉核心技術揭秘

服務開通篇

數據導入篇

數據查詢篇

運維監控篇

實踐案例篇

實踐與案例集:行業典型場景最佳實踐與經典用戶案例。