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

Event Time Column(Segment Key)

更新時(shí)間:

如果您需對(duì)大規(guī)模數(shù)據(jù)集使用基于主鍵的UPDATE或含范圍過(guò)濾條件的查詢,可以考慮為表設(shè)置Event Time Column(Segment Key),系統(tǒng)將數(shù)據(jù)文件基于Event Time Column范圍排序后進(jìn)行合并,減少文件之間的重疊,使得查詢時(shí)能夠過(guò)濾掉盡可能多的文件,從而提升查詢效率。合理地應(yīng)用Event Time Column有助于提高數(shù)據(jù)庫(kù)的處理效率、查詢速度和整體性能,本文為您介紹在Hologres中為表設(shè)置分段鍵Event_time_column。

Event Time Column介紹

Event_time_column原名為Segment Key,在Hologres V0.9版本默認(rèn)改名為Event_time_column,Segment Key依舊向下兼容使用。

Segment Key主要適用的場(chǎng)景如下:

  • 含范圍過(guò)濾條件(包括等值條件)的查詢場(chǎng)景。

  • 基于主鍵的UPDATE。

Event_time_column在設(shè)置時(shí),需要在建表時(shí)指定,語(yǔ)法如下:

-- Hologres V2.1版本起支持的語(yǔ)法
CREATE TABLE <table_name> (...) WITH (event_time_column = '[<columnName>[,...]]');

-- 所有版本支持的語(yǔ)法
BEGIN;
CREATE TABLE <table_name> (...);
call set_table_property('<table_name>', 'event_time_column', '[<columnName> [,...]]');
COMMIT;

參數(shù)說(shuō)明:

參數(shù)

說(shuō)明

table_name

設(shè)置分段鍵的表名稱。

columnName

設(shè)置分段鍵的列。

使用建議

  • Event_time_column適用于數(shù)據(jù)為單調(diào)遞增或單調(diào)遞減的有序字段,例如時(shí)間戳字段。非常適用于日志、流量等和時(shí)間強(qiáng)相關(guān)的數(shù)據(jù),合理設(shè)置可極大提升性能。完全無(wú)序的Event_time_column會(huì)導(dǎo)致合并之后每個(gè)文件缺乏區(qū)分度,達(dá)不到任何文件過(guò)濾效果。

  • 如果表不存在明顯的單調(diào)遞增或單調(diào)遞減的字段,可以選擇額外擴(kuò)充一列update_time,每次UPSERT時(shí)將當(dāng)前時(shí)間寫(xiě)入該新增字段。

  • Event_time_column具備左匹配原則,因此不建議將多個(gè)字段設(shè)置為Event_time_column,否則使得查詢場(chǎng)景受限,達(dá)不到加速效果,一般情況建議選擇設(shè)置兩個(gè)或者兩個(gè)以內(nèi)字段設(shè)置為Event_time_column。

使用限制

  • Event_time_column必須為not nullable的列或者列組合,可以不設(shè)置,但不能設(shè)置為空。Hologres V1.3.20~1.3.27版本支持Event_time_column對(duì)應(yīng)列的約束為nullable,從V1.3.28版本開(kāi)始不支持Event_time_column對(duì)應(yīng)列的約束為nullable,為nullable的Event_time_column可能會(huì)影響數(shù)據(jù)正確性,如果業(yè)務(wù)有強(qiáng)需求設(shè)置Event_time_column為null,可以在SQL前添加如下參數(shù):

    set hg_experimental_enable_nullable_segment_key = true;

    您可以使用如下SQL檢查當(dāng)前數(shù)據(jù)庫(kù)是否有屬性為nullable的Event_time_column(Segment Key):

    WITH t_base AS (
        SELECT
            *
        FROM
            hologres.hg_table_info
        WHERE
            collect_time::date = CURRENT_DATE
    ),
    t1 AS (
        SELECT
            db_name,
            schema_name,
            table_name,
            jsonb_array_elements(table_meta::jsonb -> 'columns') cols
        FROM
            t_base
    ),
    t2 AS (
        SELECT
            db_name,
            schema_name,
            table_name,
            cols ->> 'name' col_name
        FROM
            t1
        WHERE
            cols -> 'nullable' = 'true'::jsonb
    ),
    t3 AS (
        SELECT
            db_name,
            schema_name,
            table_name,
            regexp_replace(regexp_split_to_table(table_meta::jsonb ->> 'segment_key', ','), ':asc|:desc$', '') segment_key_col
        FROM
            t_base
        WHERE
            table_meta::jsonb -> 'segment_key' IS NOT NULL
    )
    SELECT
        CURRENT_DATE,
        t3.db_name,
        t3.schema_name,
        t3.table_name,
        jsonb_build_object('nullable_segment_key_column', string_agg(t3.segment_key_col, ',')) as nullable_segment_key_column
    FROM
        t2,
        t3
    WHERE
        t3.db_name = t2.db_name
        AND t3.schema_name = t2.schema_name
        AND t3.table_name = t2.table_name
        AND t2.col_name = t3.segment_key_col
    GROUP BY
        t3.db_name,
        t3.schema_name,
        t3.table_name;
    
  • 不支持修改Event_time_column,如需修改請(qǐng)重新建表。

  • 行存表不能設(shè)置Event_time_column。

  • 列存表默認(rèn)將表中的第一個(gè)非空的Timestamp或Timestamptz類型字段作為Event_time_column,如果不存在這樣的字段,則默認(rèn)將第一個(gè)非空的Date類型字段作為Event_time_column(Hologres V0.9之前的版本默認(rèn)為空)。

  • 不支持Decimal、Numeric、Float、Double、Array、Json、Jsonb、Bit、Money及其他復(fù)雜數(shù)據(jù)類型。

技術(shù)原理

以一個(gè)Shard為例,數(shù)據(jù)寫(xiě)入時(shí)的步驟如下圖所示:分段鍵技術(shù)原理

  1. 在一個(gè)Shard內(nèi),數(shù)據(jù)會(huì)先寫(xiě)入至一個(gè)內(nèi)存表,為了保證寫(xiě)入效率最高,會(huì)使用Append Only的方式寫(xiě)入。內(nèi)存表有一定的大小,當(dāng)內(nèi)存表寫(xiě)滿之后,系統(tǒng)會(huì)將內(nèi)存表中的數(shù)據(jù)逐漸異步Flush到文件。

  2. 寫(xiě)入時(shí)為了追求寫(xiě)入性能,都為Append Only方式寫(xiě)入,文件數(shù)會(huì)越來(lái)越多。因此系統(tǒng)會(huì)在后臺(tái)周期將文件進(jìn)行合并。如果設(shè)置了Event_time_column(Segment Key),系統(tǒng)將文件基于Segment Key范圍排序后,選擇Segment Key范圍相鄰的文件進(jìn)行合并,減少文件之間的重疊,這樣就使得查詢時(shí)能夠過(guò)濾掉盡可能多的文件,從而提升查詢效率。

  3. 文件基于Segment Key排序,因此Segment Key也具有左匹配原則,即abc三個(gè)字段設(shè)置了Segment Key,查詢時(shí)查a,b,c或者查a,b可以命中Segment Key,如果查a,c則只有a可以命中Segment Key,查b,c則無(wú)法命中。

從以上的介紹中可以看出Segment Key可以對(duì)以下場(chǎng)景進(jìn)行加速:

  • 含范圍過(guò)濾條件(包括等值條件)的查詢場(chǎng)景。

    如果查詢字段設(shè)置為Segment Key,那么Hologres在掃描數(shù)據(jù)時(shí),會(huì)將范圍查詢條件同文件內(nèi)列的統(tǒng)計(jì)信息(min/max)進(jìn)行匹配,快速過(guò)濾出所需的文件,加速查詢。

  • 基于主鍵的UPDATE。

    Hologres的UPDATE命令原理是由DELETE命令和INSERT命令組合實(shí)現(xiàn)。在基于主鍵的UPDATEINSERT ON CONFLICT(UPSERT)場(chǎng)景中,會(huì)先根據(jù)主鍵找到目標(biāo)表(舊數(shù)據(jù))的Segment Key值,再根據(jù)舊數(shù)據(jù)的Segment Key找到舊數(shù)據(jù)所在文件,最終定位舊數(shù)據(jù)所在位置進(jìn)而標(biāo)記為DELETE。如果設(shè)置了合理的Segment Key,那么就會(huì)快速定位到舊數(shù)據(jù)的文件,提高寫(xiě)入性能。相反,如果這張列存表沒(méi)有配置Segment Key、Segment Key配置了不合理的字段或者Segment Key對(duì)應(yīng)的字段在寫(xiě)入時(shí)沒(méi)有與時(shí)間有強(qiáng)相關(guān)性(比如基本亂序),那在查找舊數(shù)據(jù)時(shí)需要掃描的文件將會(huì)非常多,不僅會(huì)有大量的IO操作,而且會(huì)大量占用CPU,影響寫(xiě)入性能和整個(gè)實(shí)例的負(fù)載。

使用示例

  • 在建表時(shí)創(chuàng)建一個(gè)Event_time_column。

    • V2.1版本起支持的建表語(yǔ)法:

      CREATE TABLE tbl_segment_test (
          a int NOT NULL,
          b timestamptz NOT NULL
      )
      WITH (
          event_time_column = 'b'
      );
      
      INSERT INTO tbl_segment_test values
      (1,'2022-09-05 10:23:54+08'),
      (2,'2022-09-05 10:24:54+08'),
      (3,'2022-09-05 10:25:54+08'),
      (4,'2022-09-05 10:26:54+08');
      
      EXPLAIN SELECT * FROM tbl_segment_test WHERE b > '2022-09-05 10:24:54+08';
    • 所有版本支持的建表語(yǔ)法:

      BEGIN;
      CREATE TABLE tbl_segment_test (
          a int NOT NULL,
          b timestamptz NOT NULL
          );
      CALL set_table_property('tbl_segment_test', 'event_time_column', 'b');
      COMMIT;
      
      INSERT INTO tbl_segment_test VALUES 
      (1,'2022-09-05 10:23:54+08'),
      (2,'2022-09-05 10:24:54+08'),
      (3,'2022-09-05 10:25:54+08'),
      (4,'2022-09-05 10:26:54+08');
      
      EXPLAIN SELECT * FROM tbl_segment_test WHERE b > '2022-09-05 10:24:54+08';

    同時(shí)通過(guò)查詢執(zhí)行計(jì)劃(explain SQL),如果出現(xiàn)Segment Filter,說(shuō)明有查詢命中Event_time_column。分段鍵執(zhí)行計(jì)劃

  • 建表時(shí)創(chuàng)建多個(gè)Event_time_column。

    • V2.1版本起支持的建表語(yǔ)法:

      CREATE TABLE tbl_segment_test_2 (
          a int NOT NULL,
          b timestamptz NOT NULL
      )
      WITH (
          event_time_column = 'a,b'
      );
      
      INSERT INTO tbl_segment_test_2 VALUES 
      (1,'2022-09-05 10:23:54+08'),
      (2,'2022-09-05 10:24:54+08'),
      (3,'2022-09-05 10:25:54+08'),
      (4,'2022-09-05 10:26:54+08')
      ;
      
      --不可命中segment key
      SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08';
      
      --可命中segment key
      SELECT * FROM tbl_segment_test_2 WHERE a = 3 and b > '2022-09-05 10:24:54+08';
      SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b < '2022-09-05 10:26:54+08';
      SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b > '2022-09-05 10:24:54+08';
    • 所有版本支持的建表語(yǔ)法:

      BEGIN;
      CREATE TABLE tbl_segment_test_2 (
          a int NOT NULL,
          b timestamptz NOT NULL
          );
      CALL set_table_property('tbl_segment_test_2', 'event_time_column', 'a,b');
      COMMIT;
      
      INSERT INTO tbl_segment_test_2 VALUES 
      (1,'2022-09-05 10:23:54+08'),
      (2,'2022-09-05 10:24:54+08'),
      (3,'2022-09-05 10:25:54+08'),
      (4,'2022-09-05 10:26:54+08')
      ;
      
      --不可命中segment key
      SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08';
      
      --可命中segment key
      SELECT * FROM tbl_segment_test_2 WHERE a = 3 and b > '2022-09-05 10:24:54+08';
      SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b < '2022-09-05 10:26:54+08';
      SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b > '2022-09-05 10:24:54+08';

相關(guān)文檔