lz4 في الإصدار المُدار ذاتيًا، وzstd في ClickHouse Cloud.
بالنسبة إلى عائلة محركات MergeTree، يمكنك تغيير طريقة الضغط الافتراضية في قسم الضغط ضمن إعدادات الخادم.
يمكنك أيضًا تحديد طريقة الضغط لكل عمود على حدة في استعلام CREATE TABLE.
Default للإشارة إلى الضغط الافتراضي، الذي قد يعتمد وقت التشغيل على إعدادات مختلفة وخصائص البيانات.
مثال: value UInt64 CODEC(Default) — أي ما يعادل عدم تحديد برنامج ترميز.
راجع أيضًا الاختيار التكيفي لبرنامج الترميز.
يمكنك أيضًا إزالة CODEC الحالي من العمود واستخدام الضغط الافتراضي من config.xml:
CODEC(Delta, Default).
يدعم الضغط في محركات الجداول التالية:
- عائلة MergeTree: تدعم برامج ترميز ضغط الأعمدة وتحديد طريقة الضغط الافتراضية من خلال إعدادات الضغط.
- عائلة Log: تستخدم طريقة الضغط
lz4افتراضيًا وتدعم برامج ترميز ضغط الأعمدة. - Set: لا يدعم سوى الضغط الافتراضي.
- Join: لا يدعم سوى الضغط الافتراضي.
برامج الترميز العامة
NONE
NONE — بدون ضغط.
LZ4
LZ4 — خوارزمية ضغط بيانات بلا فقدان، تُستخدم افتراضيًا. تستخدم ضغط LZ4 السريع.
LZ4HC
LZ4HC[(level)] — خوارزمية LZ4 HC (ضغط عالٍ) ذات مستوى قابل للضبط. المستوى الافتراضي: 9. يؤدي ضبط level <= 0 إلى استخدام المستوى الافتراضي. المستويات المتاحة: [1, 12]. نطاق المستويات الموصى به: [4, 9].
ZSTD
ZSTD[(level)] — خوارزمية الضغط ZSTD ذات level قابل للضبط. المستويات المتاحة: [1, 22]. المستوى الافتراضي: 1.
تكون مستويات الضغط العالية مفيدة في السيناريوهات غير المتناظرة، مثل الضغط مرة واحدة وفك الضغط مرارًا. فكلما ارتفع المستوى، تحسن الضغط وزاد استخدام CPU.
ZXC
ZXC[(level)] — خوارزمية الضغط غير المتماثل zxc مع level قابل للضبط. المستويات المتاحة: [1, 7]. المستوى الافتراضي: 3.
يُفضّل ZXC فك الضغط فائق السرعة على حساب ضغط أبطأ، بنسبة ضغط تتراوح بين LZ4 وZSTD. وهو مناسب لنمط الضغط مرة واحدة وفك الضغط عدة مرات، ويحقق أسرع أداء لفك الضغط على أنوية ARM الحديثة. تعني المستويات الأعلى ضغطًا أفضل وأبطأ، بينما يبقى فك الضغط سريعًا.
برنامج الترميز هذا تجريبي، ويتطلب استخدامه ضبط
SET allow_experimental_codecs = 1.متقادمة: ZSTD_QAT
متقادم: DEFLATE_QPL
برامج الترميز المتخصصة
دلتا
Delta(delta_bytes) — أسلوب ضغط تُستبدل فيه القيم الخام بفروق القيم المتجاورة، باستثناء القيمة الأولى التي تبقى دون تغيير. يشير delta_bytes إلى الحد الأقصى لحجم القيم الخام، وتكون قيمته الافتراضية sizeof(type). أُهمل تحديد delta_bytes كوسيطة، وستُزال دعمه في إصدار مستقبلي. دلتا هو برنامج ترميز لإعداد البيانات، أي لا يمكن استخدامه بمفرده.
DoubleDelta
DoubleDelta(bytes_size) — يحسب دلتا الفروق ويكتبها بصيغة ثنائية مدمجة. يحمل bytes_size معنى مشابهاً لـ delta_bytes في برنامج ترميز Delta. أصبح تحديد bytes_size كوسيط مهجوراً، وستُزال دعمه في إصدار مستقبلي. تتحقق أفضل معدلات الضغط للتسلسلات الرتيبة ذات stride ثابت، مثل بيانات السلاسل الزمنية. يمكن استخدامه مع أي نوع رقمي. يطبق الخوارزمية المستخدمة في Gorilla TSDB، مع توسيعها لدعم الأنواع ذات 64 بت. يستخدم بتاً إضافياً واحداً لفروق 32 بت: بادئات من 5 بت بدلاً من بادئات من 4 بت. لمزيد من المعلومات، راجع Compressing Time Stamps في Gorilla: A Fast, Scalable, In-Memory Time Series Database. يُعد DoubleDelta برنامج ترميز لإعداد البيانات، أي لا يمكن استخدامه بصورة مستقلة.
GCD
GCD() - - يحسب القاسم المشترك الأكبر (GCD) لقيم العمود، ثم يقسم كل قيمة على GCD. يمكن استخدامه مع أعمدة الأعداد الصحيحة والأعداد العشرية وأعمدة التاريخ/الوقت. يناسب برنامج الترميز هذا الأعمدة التي تتغير قيمها (زيادةً أو نقصانًا) بمضاعفات GCD، مثل: 24، 28، 16، 24، 8، 24 (GCD = 4). يُعد GCD برنامج ترميز لإعداد البيانات، أي لا يمكن استخدامه بمفرده.
Gorilla
Gorilla(bytes_size) — يحسب عملية XOR بين قيمة الفاصلة العائمة الحالية والسابقة، ويكتب الناتج بصيغة ثنائية مضغوطة. كلما صغر الفرق بين القيم المتتالية، أي كلما تغيّرت قيم السلسلة ببطء أكبر، تحسّن معدل الضغط. ينفّذ الخوارزمية المستخدمة في Gorilla TSDB مع توسيعها لدعم الأنواع ذات 64 بت. القيم الممكنة لـ bytes_size هي: 1، 2، 4، 8. والقيمة الافتراضية هي sizeof(type) إذا كانت تساوي 1 أو 2 أو 4 أو 8؛ وفي جميع الحالات الأخرى تكون 1. لمزيد من المعلومات، راجع القسم 4.1 في Gorilla: A Fast, Scalable, In-Memory Time Series Database.
ALP
ALP(variant) — ضغط تكيّفي بلا فقدان للبيانات ذات الفاصلة العائمة. يدعم Float32 وFloat64. لمزيد من التفاصيل، راجع ALP: Adaptive lossless floating-point compression.
يقبل برنامج الترميز هذا وسيطة اختيارية لتحديد المتغير:
ALP()أوALP(AUTO)(افتراضيًا) — يستخدم STD، ويعود إلى RD استنادًا إلى الحجم المضغوط المُقدَّر.ALP(STD)— متغير ALP القياسي. يمثّل كل قيمة كعدد صحيح مُقاس بدقة باستخدام قوى العدد 10، ثم يضغط الأعداد الصحيحة الناتجة باستخدام Frame-of-Reference وحزم البتات. تُخزَّن القيم التي لا يمكن تمثيلها كاستثناءات خام. يعمل على نحو أفضل مع الأرقام المشتقة من القيم العشرية، مثل القياسات والأسعار.ALP(RD)— متغير Real Doubles. يعيد تفسير نمط بتات كل قيمة ويقسّمه إلى جزء علوي (الإشارة + الأس + البتات العليا من المانتيسا) وجزء سفلي. تُشفَّر الأجزاء العليا باستخدام قاموس (بحد أقصى 8 إدخالات)، وتُحزم الأجزاء السفلى بالبتات. يعمل على نحو أفضل عندما تشترك قيم كثيرة في البتات العليا نفسها.
برنامج الترميز هذا تجريبي، ويتطلب استخدامه
SET allow_experimental_codecs = 1.FPC
FPC(level, float_size) - يتنبأ مرارًا بقيمة الفاصلة العائمة التالية في التسلسل باستخدام الأدق من متنبئين، ثم يُجري عملية XOR بين القيمة الفعلية والقيمة المتنبأ بها، ويضغط النتيجة بحذف الأصفار البادئة. على غرار Gorilla، تكون هذه الطريقة فعالة عند تخزين سلسلة من قيم الفاصلة العائمة التي تتغير ببطء. بالنسبة إلى القيم ذات 64 بت (double)، يكون FPC أسرع من Gorilla، أما القيم ذات 32 بت فقد تختلف النتائج. قيم level الممكنة هي: 1-28، والقيمة الافتراضية هي 12. قيم float_size الممكنة هي: 4 و8، والقيمة الافتراضية هي sizeof(type) إذا كان النوع Float. وفي جميع الحالات الأخرى، تكون 4. للاطلاع على وصف تفصيلي للخوارزمية، راجع High Throughput Compression of Double-Precision Floating-Point Data.
SZ3
SZ3 أو SZ3(algorithm, error_bound_mode, error_bound) — برنامج ترميز مع فقدان للبيانات ومقيّد بحدّ للخطأ (SZ3 Lossy Compressor) للأعمدة من النوع Float32 أو Float64 أو Array(Float32) أو Array(Float64). بالنسبة إلى أعمدة المصفوفات، يكون الضغط أكثر فعالية عندما تكون جميع المصفوفات بالطول نفسه (إذ تُضغط حينها كمتجهات ثابتة العرض)؛ كما تُدعم المصفوفات ذات الأطوال المختلفة وتُضغط كتسلسل مسطّح من القيم. لا ينطبق برنامج الترميز على أعمدة Map، لأن مفاتيحها ستتلف بسبب الضغط مع فقدان للبيانات. القيم المدعومة للمعامل ‘algorithm’ هي ALGO_LORENZO_REG وALGO_INTERP_LORENZO وALGO_INTERP. والقيم المدعومة للمعامل ‘error_bound_mode’ هي ABS وREL وPSNR وABS_AND_REL. الوسيط ‘error_bound’ هو الحد الأقصى للخطأ، ونوعه Float64.
برنامج الترميز هذا تجريبي، ويتطلب استخدام
SET allow_experimental_codecs = 1.T64
T64 — أسلوب ضغط يقتطع البتات العليا غير المستخدمة من القيم في أنواع البيانات الصحيحة (بما في ذلك Enum وDate وDateTime). في كل خطوة من خوارزميته، يأخذ برنامج الترميز كتلة تضم 64 قيمة، ويضعها في مصفوفة بتات بحجم 64x64، ثم ينقلها ويقتطع البتات غير المستخدمة من القيم ويُرجع الباقي كتسلسل. والبتات غير المستخدمة هي البتات التي لا تختلف بين القيمتين الصغرى والكبرى ضمن جزء البيانات الكامل الذي يُستخدم فيه الضغط.
يُستخدم برنامجا الترميز DoubleDelta وGorilla في Gorilla TSDB كمكوّنين من خوارزمية الضغط الخاصة به. ويكون أسلوب Gorilla فعالًا عندما توجد سلسلة من القيم التي تتغير ببطء مع طوابعها الزمنية. تُضغط الطوابع الزمنية بكفاءة باستخدام برنامج الترميز DoubleDelta، وتُضغط القيم بكفاءة باستخدام برنامج الترميز Gorilla. على سبيل المثال، لإنشاء جدول يُخزَّن بكفاءة، يمكنك إنشاؤه بالتكوين التالي:
التكميم
Quantized(method, dimensions[, ...]) — برنامج ترميز متخصص لدعم البحث التقريبي عن المتجهات في أعمدة من النوع Array(Float32) أو Array(Float64) أو Array(BFloat16).
يخزّن المتجهات الأصلية كاملة الدقة، إلى جانب شيفرة مكمّاة مضغوطة لكل متجه.
في جداول عائلة MergeTree، تفحص استعلامات البحث عن المتجهات التي تستخدم الإعداد vector_search_use_quantized_codes الشيفرات المكمّاة لإنشاء قائمة مختصرة، ثم تعيد احتساب النتائج باستخدام المتجهات كاملة الدقة.
يقرأ هذا البحث المؤلف من مرحلتين بايتات أقل من فحص عادي كامل الدقة، لكن على حساب انخفاض الاستدعاء.
تمثل dimensions طول المتجه؛ وقيم method المدعومة هي rabitq وturboquant وint8 وprefix وproduct، ويقدم كل منها مفاضلة مختلفة بين الحجم والدقة ودالة المسافة.
لا يمكن تعيين برنامج الترميز إلا في CREATE TABLE، ولا يمكن إضافته أو إزالته أو تغييره عبر ALTER TABLE، بما في ذلك باستخدام ADD COLUMN ... CODEC(Quantized(...)).
ولا يمكن ربطه بأي برنامج ترميز آخر، حتى برنامج ترميز التشفير مثل AES_128_GCM_SIV.
لمزيد من التفاصيل، راجع البحث عن المتجهات باستخدام برامج الترميز المكمّاة.
برامج ترميز التشفير
AES_128_GCM_SIV
CODEC('AES-128-GCM-SIV') — يشفّر البيانات باستخدام AES-128 في وضع GCM-SIV وفقًا لـ RFC 8452.
AES-256-GCM-SIV
CODEC('AES-256-GCM-SIV') — يشفّر البيانات باستخدام AES-256 بوضع GCM-SIV.
تستخدم برامج الترميز هذه قيمة nonce ثابتة، لذا يكون التشفير حتميًا. وهذا يجعلها متوافقة مع محركات إزالة التكرار مثل ReplicatedMergeTree، لكنها تنطوي على نقطة ضعف: فعند تشفير كتلة البيانات نفسها مرتين، يكون النص المشفّر الناتج متطابقًا تمامًا، مما يتيح لمهاجم قادر على قراءة القرص ملاحظة هذا التطابق (دون أن يتمكن من معرفة المحتوى).
تنشئ معظم المحركات، بما في ذلك عائلة “*MergeTree”، ملفات فهرسة على القرص دون تطبيق برامج الترميز. وهذا يعني أن النص الصريح سيظهر على القرص إذا كان العمود المشفّر مفهرسًا.
إذا أجريت استعلام SELECT يتضمن قيمة محددة في عمود مشفّر (مثلًا في عبارة WHERE)، فقد تظهر القيمة في system.query_log. قد ترغب في تعطيل التسجيل.
إذا كان ينبغي تطبيق الضغط، فيجب تحديده صراحةً. وإلا، فلن يُطبَّق على البيانات سوى التشفير.
الاختيار التكيفي لبرنامج الترميز
allow_experimental_adaptive_codec_selection، يتولى ClickHouse الاختيار نيابةً عنك. بالنسبة إلى الأعمدة التي تستخدم برنامج الترميز الافتراضي (CODEC(Default) أو لا تستخدم CODEC مطلقًا)، تُكتب كل كتلة ببرنامج الترميز الذي يحقق أصغر حجم ممكن بعد الضغط، ويُختار من بين برنامج الترميز الافتراضي للجدول وNONE وبرامج الترميز المتخصصة الملائمة لنوع العمود.
لا يزيد حجم الكتلة مطلقًا عما كان سيحققه برنامج الترميز الافتراضي، وتُخزَّن البيانات غير القابلة للضغط بصيغتها الخام، لأن ضغطها سينتج ملفًا أكبر قليلًا وأبطأ في القراءة. تتم هذه العملية في الخلفية أثناء عمليات الدمج والطفرات، حيث تُعاد البيانات إلى الضغط على أي حال. لا تتأثر سرعة الإدراج. وغالبًا ما تصبح الاستعلامات أسرع: إذ يُجلب قدر أقل من البيانات من القرص، ويجب فك ضغط كل كتلة يقرأها الاستعلام أولًا، كما أن فك ضغط برامج الترميز المتخصصة أسرع من فك ضغط LZ4 الافتراضي. تسجل كل كتلة برنامج الترميز الذي كُتبت به، لذا لا تتطلب القراءة أي إعداد، ويمكن إيقاف الميزة في أي وقت مع بقاء جميع البيانات قابلة للقراءة.
mergeTreeCodecBlockCounts. هنا، تزداد قيمة time باطراد، لذا تفوّق T64، الذي لا يخزّن سوى البتات المتغيرة داخل الكتلة، على برنامج الترميز الافتراضي في كل كتلة. يحتوي user_id على قيم hash لا يستطيع أي برنامج ترميز تقليصها، لذا خُزّنت كُتله بصيغتها الخام:
Decimal32/Decimal64، وIPv4.