Tüm Ürünler
Search
Belge Merkezi

Hologres:Olay zamanı sütunu (bölüm anahtarı)

Son Güncelleme:Oct 06, 2026

Büyük veri kümelerinde, birincil anahtar bazlı UPDATE işlemlerini sıkça yapıyorsanız veya aralık filtresi koşulları içeren sorgular çalıştırıyorsanız bir olay zamanı sütunu (bölüm anahtarı) belirlemeyi düşünün. Sistem, dosyaları birleştirmeden önce olay zamanı sütunu aralığına göre sıralar. Bu işlem, dosyalar arasındaki örtüşmeyi azaltarak sorgu motorunun mümkün olduğunca çok dosyayı elemesini sağlar ve sorgu verimliliğini artırır. Doğru yapılandırılmış bir olay zamanı sütunu sorgu hızını ve genel performansı iyileştirir. Bu konuda, Hologres'te bir tablo için event_time_column özelliğinin nasıl ayarlanacağı açıklanmaktadır.

Olay zamanı sütunu

event_time_column özelliği daha önce segment key olarak adlandırılıyordu. Hologres V0.9 ve sonraki sürümlerde varsayılan özellik adı event_time_column şeklindedir. segment key özelliği geriye dönük uyumluluk amacıyla korunur.

Olay zamanı sütunu öncelikle aşağıdaki senaryolarda kullanılır:

  • Aralık filtresi veya eşitlik koşulu içeren sorgular.

  • Birincil anahtar bazlı UPDATE işlemleri.

event_time_column özelliğini ayarlamak için bu özelliği tabloyu oluştururken belirtin. Aşağıdaki sözdizimini kullanın:

-- Syntax supported in Hologres V2.1 and later
CREATE TABLE <table_name> (...) WITH (event_time_column = '[<columnName>[,...]]');
-- Syntax supported in all versions
BEGIN;
CREATE TABLE <table_name> (...);
call set_table_property('<table_name>', 'event_time_column', '[<columnName> [,...]]');
COMMIT;

Parametreler:


Parameter


Description


table_name


Tablonun adı.


columnName


Olay zamanı sütunu olarak kullanılacak sütun.

Öneriler

  • Olay zamanı sütunu en iyi şekilde, zaman damgası sütunları gibi monoton olarak artan veya azalan değerlere sahip sütunlar için uygundur. Günlükler ve trafik verileri gibi zamanla ilgili verilerde doğru yapılandırma performansı önemli ölçüde artırabilir. Bir olay zamanı sütunu tamamen düzensizse birleştirilen dosyaların belirgin değer aralıkları olmaz ve bu durum dosya eleme avantajlarını ortadan kaldırır.

  • Bir tabloda açıkça monoton olarak artan veya azalan bir sütun yoksa update_time gibi bir sütun eklemeyi ve her UPSERT işlemi için mevcut zamanı bu sütuna yazmayı düşünün.

  • Olay zamanı sütunu, sol eşleşme ilkesi nu izler. Birden fazla sütun ayarlamak hangi sorgu kalıplarının hızlandırılacağını sınırlayabilir. Bu nedenle çoğu durumda iki sütundan fazlasını belirtmemenizi öneririz.

Sınırlamalar

  • Olay zamanı sütunu, NOT NULL olarak tanımlanan bir sütun veya sütun kombinasyonu olmalıdır. event_time_column özelliğini atlayabilirsiniz ancak bunu null değerlere izin veren bir sütuna ayarlayamazsınız. Hologres V1.3.20 ile V1.3.27 arasında event_time_column özelliği için null yapılabilir sütunlar destekleniyordu. Hologres V1.3.28'den itibaren null yapılabilir bir olay zamanı sütunu veri bütünlüğünü tehlikeye atabileceğinden bu artık desteklenmez. Null yapılabilir bir sütunu olay zamanı sütunu olarak ayarlama konusunda güçlü bir iş gereksiniminiz varsa SQL ifadenizden önce aşağıdaki deyimi ekleyin:

    set hg_experimental_enable_nullable_segment_key = true;

    Mevcut veritabanında null yapılabilir herhangi bir olay zamanı sütunu (veya bölüm anahtarı) olup olmadığını kontrol etmek için aşağıdaki SQL ifadesini kullanın:

    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;
    
  • Bir tablo oluşturulduktan sonra event_time_column özelliğini değiştiremezsiniz. Bunu değiştirmek için tabloyu yeniden oluşturmanız gerekir.

  • Satır yönelimli tablo için bir olay zamanı sütunu ayarlayamazsınız.

  • Sütun yönelimli tablo için açıkça bir olay zamanı sütunu ayarlamazsanız Hologres varsayılan olarak TIMESTAMP veya TIMESTAMPTZ veri türündeki ilk NOT NULL sütunu olay zamanı sütunu olarak kullanır. Böyle bir sütun yoksa DATE veri türündeki ilk NOT NULL sütun kullanılır. Hologres V0.9'dan önceki sürümlerde varsayılan bir olay zamanı sütunu ayarlanmaz.

  • Bir olay zamanı sütunu için DECIMAL, NUMERIC, FLOAT, DOUBLE, ARRAY, JSON, JSONB, BIT, MONEY veya diğer karmaşık veri türlerini kullanamazsınız.

Çalışma mekanizması

Aşağıdaki şekil, tek bir parça içindeki veri yazma işlemini göstermektedir:分段键技术原理

  1. Bir parça içinde veriler önce yazma performansını en üst düzeye çıkarmak için yalnızca ekleme modunda bir bellek içi tabloya yazılır. Bellek içi tablolar sabit bir boyuta sahiptir. Bir bellek içi tablo dolduğunda sistem verilerini dosyalara eşzamansız olarak aktarır.

  2. Yazma performansını optimize etmek için veriler yalnızca ekleme modunda yazılır; bu da zamanla dosya sayısının artmasına neden olur. Sistem bu dosyaları arka planda periyodik olarak birleştirir. Bir olay zamanı sütunu (veya bölüm anahtarı) ayarlarsanız sistem dosyaları olay zamanı sütunu aralığına göre sıralar ve ardından bitişik aralıklara sahip dosyaları birleştirir. Bu işlem, dosyalar arasındaki örtüşmeyi azaltarak sorgu iyileştiricisinin daha fazla dosyayı elemesini sağlar ve sorgu verimliliğini artırır.

  3. Dosyalar olay zamanı sütunu bazında sıralanır. Bu nedenle olay zamanı sütunu ayrıca sol eşleşme ilkesi ne de uyar. Örneğin a, b ve c sütunlarını olay zamanı sütunu olarak ayarlarsanız filtre koşulları a,b,c veya a,b üzerindeyse bir sorgu bu ayardan yararlanabilir. Filtre koşulları a,c üzerindeyse yalnızca a sütunu yararlanabilir. Filtre koşulları b,c üzerindeyse sorgu olay zamanı sütunu ndan yararlanamaz.

Açıklandığı gibi olay zamanı sütunu aşağıdaki senaryoları hızlandırabilir:

  • Aralık filtresi veya eşitlik koşulu içeren sorgular.

    Sorgulanan bir sütun olay zamanı sütunu olarak ayarlandıysa Hologres sorgudaki aralık koşullarını sütunun dosya düzeyindeki istatistikleri (min/maks) ile karşılaştırır. Bu, Hologres'in ilgisiz dosyaları hızlıca elemesine ve sorguyu hızlandırmasına olanak tanır.

  • Birincil anahtar bazlı UPDATE işlemleri.

    Hologres UPDATE komutu, DELETE ve INSERT komutlarının bir kombinasyonu olarak uygulanır. Birincil anahtar bazlı UPDATE veya INSERT ON CONFLICT(UPSERT) içeren senaryolarda önce hedef tablodaki eski verilerin bölüm anahtarını bulmak için birincil anahtar kullanılır. Ardından eski verileri içeren dosyayı konumlandırmak için bu bölüm anahtarı kullanılır ve veriler sonunda DELETE olarak işaretlenir. Bölüm anahtarı doğru yapılandırılırsa eski verileri içeren dosya hızlıca bulunabilir ve bu da yazma performansını artırır. Tersine sütun yönelimli bir tabloda bölüm anahtarı yapılandırılmamışsa, bölüm anahtarı uygun olmayan bir alanla yapılandırılmışsa veya veri yazmaları sırasında bölüm anahtarı için kullanılan alanın zamanla güçlü bir ilişkisi yoksa (örneğin veriler çoğunlukla düzensizse) eski verileri bulmak için çok sayıda dosyanın taranması gerekir. Bu işlem sadece çok sayıda G/Ç işlemine neden olmakla kalmaz aynı zamanda önemli miktarda CPU kaynağı tüketir ve bu da yazma performansını ve tüm örneğin yükünü olumsuz etkiler.

Örnekler

  • Bir EXPLAIN ifadesi çalıştırarak yürütme planını kontrol edebilirsiniz. Planda Segment Filter görünüyorsa sorgu olay zamanı sütunu nu kullanıyor demektir. Aşağıdaki plan bir Segment Filter içerir; bu da olay zamanı sütunu nun etkin olduğunu gösterir.

    Bir tablo oluştururken tek bir olay zamanı sütunu oluşturun.

    • Hologres V2.1 ve sonraki sürümlerde desteklenen sözdizimi:

      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';
    • Tüm sürümlerde desteklenen sözdizimi:

      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';
    QUERY PLAN
    Gather  (cost=0.00..1.10 rows=1 width=12)
      -> Exchange (Gather Exchange)  (cost=0.00..1.10 rows=1 width=12)
        -> Decode  (cost=0.00..1.10 rows=1 width=12)
          -> Index Scan using holo_index:[1] on tbl_segment_test  (cost=0.00..1.00 rows=1 width=12)
                Segment Filter: (b > '2022-09-05 10:24:54+08'::timestamp with time zone)
    Optimizer: HQO version 1.3.0
  • Bir tablo oluştururken birden fazla olay zamanı sütunu oluşturun.

    • Hologres V2.1 ve sonraki sürümlerde desteklenen sözdizimi:

      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')
      ;
      -- The query does not hit the event time column.
      SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08';
      -- The query hits the event time column.
      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';
    • Tüm sürümlerde desteklenen sözdizimi:

      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')
      ;
      -- The query does not hit the event time column.
      SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08';
      -- The query hits the event time column.
      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';

İlgili konular