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 filtresiveyaeşitlik koşuluiçeren sorgular.Birincil anahtarbazlıUPDATEiş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:
|
|
|
|
|
|
|
|
|
Öneriler
Olay zamanı sütunuen 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. Birolay zamanı sütunutamamen 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_timegibi bir sütun eklemeyi ve herUPSERTişlemi için mevcut zamanı bu sütuna yazmayı düşünün.Olay zamanı sütunu,sol eşleşme ilkesinu 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 NULLolarak 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ındaevent_time_columnözelliği için null yapılabilir sütunlar destekleniyordu. Hologres V1.3.28'den itibaren null yapılabilir birolay zamanı sütunuveri bütünlüğünü tehlikeye atabileceğinden bu artık desteklenmez. Null yapılabilir bir sütunuolay zamanı sütunuolarak 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(veyabö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 tabloiçin birolay zamanı sütunuayarlayamazsınız.Sütun yönelimli tabloiçin açıkça birolay zamanı sütunuayarlamazsanız Hologres varsayılan olarakTIMESTAMPveyaTIMESTAMPTZveri türündeki ilkNOT NULLsütunuolay zamanı sütunuolarak kullanır. Böyle bir sütun yoksaDATEveri türündeki ilkNOT NULLsütun kullanılır. Hologres V0.9'dan önceki sürümlerde varsayılan birolay zamanı sütunuayarlanmaz.Bir
olay zamanı sütunuiçinDECIMAL,NUMERIC,FLOAT,DOUBLE,ARRAY,JSON,JSONB,BIT,MONEYveya 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:
Bir
parçaiçinde veriler önce yazma performansını en üst düzeye çıkarmak için yalnızca ekleme modunda birbellek içi tabloyayazılır.Bellek içi tablolarsabit bir boyuta sahiptir. Birbellek içi tablodolduğunda sistem verilerini dosyalara eşzamansız olarak aktarır.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(veyabölüm anahtarı) ayarlarsanız sistem dosyalarıolay zamanı sütunuaralığı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.Dosyalar
olay zamanı sütunubazında sıralanır. Bu nedenleolay zamanı sütunuayrıcasol eşleşme ilkesine de uyar. Örneğina,bvecsütunlarınıolay zamanı sütunuolarak ayarlarsanız filtre koşullarıa,b,cveyaa,büzerindeyse bir sorgu bu ayardan yararlanabilir. Filtre koşullarıa,cüzerindeyse yalnızcaasütunu yararlanabilir. Filtre koşullarıb,cüzerindeyse sorguolay zamanı sütunundan yararlanamaz.
Açıklandığı gibi olay zamanı sütunu aşağıdaki senaryoları hızlandırabilir:
-
Aralık filtresiveyaeşitlik koşuluiçeren sorgular.Sorgulanan bir sütun
olay zamanı sütunuolarak 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 anahtarbazlıUPDATEişlemleri.Hologres
UPDATEkomutu,DELETEveINSERTkomutları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 sonundaDELETEolarak 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
EXPLAINifadesi çalıştırarakyürütme planınıkontrol edebilirsiniz. PlandaSegment Filtergörünüyorsa sorguolay zamanı sütununu kullanıyor demektir. Aşağıdaki plan birSegment Filteriçerir; bu daolay zamanı sütununun etkin olduğunu gösterir.Bir tablo oluştururken tek bir
olay zamanı sütunuoluş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ütunuoluş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
Sorgu kalıplarınız için doğru tablo özelliklerini seçme konusunda rehberlik için bkz. Senaryoya özel tablo oluşturma ve ayarlama kılavuzu.
-
Hologres dahili tablolarıyla ilgili DDL ifadeleri için bkz.: