أنواع البيانات
القيم العددية
precision (إجمالي عدد الأرقام) وscale (عدد الأرقام إلى يمين الفاصلة العشرية)
بحد أقصى إجمالي يبلغ 38. كما أن تعريفات الأعداد الصحيحة تُعد مرادفةً للنوع Number، وهي ببساطة
تحدّد precision وscale ثابتين مع بقاء النطاق نفسه. وتعود هذه السهولة إلى
أن تعديل precision (حيث تكون قيمة scale مساوية لـ 0 في الأعداد الصحيحة) لا يؤثر في
حجم البيانات على القرص في Snowflake، إذ يُستخدم الحد الأدنى المطلوب من البايتات
للنطاق العددي عند الكتابة على مستوى micro partition. أما scale،
فهو يؤثر في مساحة التخزين، ويُعوَّض ذلك عبر الضغط. ويوفّر النوع Float64
نطاقًا أوسع من القيم مقابل بعض الفقد في الدقة.
في المقابل، يوفّر ClickHouse درجات دقة متعددة، موقّعة وغير موقّعة،
للأعداد العائمة والأعداد الصحيحة. وباستخدام هذه الأنواع، يمكنك تحديد
مقدار الدقة المطلوبة للأعداد الصحيحة بدقة لتحسين استهلاك التخزين والذاكرة. كما أن النوع
Decimal، وهو المكافئ للنوع Number في Snowflake، يوفّر أيضًا ضعف
precision وscale ليصل إلى 76 رقمًا. وإضافةً إلى النوع Float64 المماثل،
يوفّر ClickHouse أيضًا النوع Float32 للحالات التي تكون فيها الدقة أقل أهمية ويكون
الضغط فيها أولوية قصوى.
السلاسل النصية
VARCHAR في Snowflake بمحارف Unicode بترميز UTF-8، ما يتيح للمستخدم
تحديد حد أقصى للطول. ولا يؤثر هذا الطول في التخزين أو
الأداء، إذ يُستخدم دائمًا الحد الأدنى من البايتات لتخزين السلسلة النصية، وهو
يفرض فقط قيودًا تفيد الأدوات اللاحقة. أما الأنواع الأخرى، مثل
Text وNChar، فهي مجرد أسماء بديلة لهذا النوع. وعلى النقيض من ذلك، يخزّن ClickHouse
كل بيانات السلاسل النصية كبايتات خام باستخدام النوع String
(من دون الحاجة إلى تحديد الطول)، ويترك مسألة الترميز للمستخدم، مع
توفّر دوال وقت الاستعلام
للتعامل مع الترميزات المختلفة. ونحيل القارئ إلى “Opaque data argument”
للاطلاع على الدافع وراء ذلك. لذلك، فإن String في ClickHouse أقرب من حيث التنفيذ
إلى النوع Binary في Snowflake. ويدعم كل من Snowflake
وClickHouse
ميزة “collation”، بما يتيح للمستخدمين تخصيص كيفية فرز السلاسل النصية ومقارنتها.
الأنواع شبه المهيكلة
VARIANT وOBJECT وARRAY للبيانات شبه المهيكلة.
توفّر ClickHouse الأنواع المكافئة Variant،
وObject (وهو الآن مهمل لصالح النوع JSON الأصلي) وArray.
بالإضافة إلى ذلك، توفّر ClickHouse النوع JSON
الذي يحل محل النوع Object('json') المهمل حاليًا، ويتميّز
بأداء عالٍ وكفاءة في التخزين عند مقارنته بأنواع JSON الأصلية الأخرى.
تدعم ClickHouse أيضًا Tuples المسمّاة ومصفوفات من Tuples
من خلال النوع Nested،
مما يتيح للمستخدمين تمثيل البُنى المتداخلة بشكل صريح. ويتيح ذلك تطبيق codecs وتحسينات
الأنواع عبر كامل البنية الهرمية، بخلاف Snowflake التي
تتطلب من المستخدم استخدام الأنواع OBJECT وVARIANT وARRAY للكائن
الخارجي، ولا تسمح بالتحديد الصريح للأنواع الداخلية.
كما أن هذا التحديد الداخلي للأنواع يبسّط أيضًا الاستعلامات على القيم العددية المتداخلة في ClickHouse،
إذ لا تحتاج إلى تحويل نوع ويمكن استخدامها في تعريفات الفهارس.
في ClickHouse، يمكن أيضًا تطبيق codecs والأنواع المُحسّنة على البُنى الفرعية.
وهذا يوفّر ميزة إضافية تتمثل في أن الضغط مع البُنى المتداخلة تظل
ممتازة ومقاربة لما هي عليه في البيانات المسطّحة. وعلى النقيض، ونتيجة
عدم القدرة على تطبيق أنواع محددة على البُنى الفرعية، توصي Snowflake بتسطيح
البيانات لتحقيق ضغط أمثل.
كما تفرض Snowflake أيضًا قيودًا على الحجم
على هذه الأنواع من البيانات.
مرجع الأنواع
| Snowflake | ClickHouse | ملاحظة | |
|---|---|---|---|
NUMBER | Decimal | يدعم ClickHouse دقةً وعددَ منازل عشرية يساويان ضعف ما يتيحه Snowflake — 76 رقمًا مقابل 38. | |
FLOAT, FLOAT4, FLOAT8 | Float32, Float64 | جميع الأعداد ذات الفاصلة العائمة في Snowflake هي من نوع 64 بت. | |
VARCHAR | String | ||
BINARY | String | ||
BOOLEAN | Bool | ||
DATE | Date, Date32 | يوفّر DATE في Snowflake نطاقًا أوسع للتواريخ من ClickHouse. فعلى سبيل المثال، الحد الأدنى لـ Date32 هو 1900-01-01، ولـ Date هو 1970-01-01. كما يوفّر Date في ClickHouse تخزينًا أوفر من حيث التكلفة، إذ يشغل بايتين فقط. | |
TIME(N) | لا يوجد ما يعادله مباشرةً، لكن يمكن تمثيله باستخدام DateTime وDateTime64(N). | DateTime64 يستخدم مفهوم الدقة نفسه. | |
TIMESTAMP - TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ | DateTime وDateTime64 | يمكن تحديد معلمة TZ اختياريًا للعمود في DateTime وDateTime64. وإذا لم تكن موجودة، تُستخدم المنطقة الزمنية الخاصة بالخادم. بالإضافة إلى ذلك، تتوفر للعميل معلمة --use_client_time_zone. | |
VARIANT | JSON, Tuple, Nested | النوع JSON لا يزال تجريبيًا في ClickHouse. ويستنتج هذا النوع أنواع الأعمدة عند الإدراج. ويمكن أيضًا استخدام Tuple وNested وArray كبديل لبناء هياكل ذات أنواع محددة صراحةً. | |
OBJECT | Tuple, Map, JSON | يُماثل كلٌّ من OBJECT وMap النوع JSON في ClickHouse، حيث تكون المفاتيح من النوع String. ويتطلب ClickHouse أن تكون القيم متسقة ومحددة النوع بشكل صارم، بينما تستخدم Snowflake VARIANT. وهذا يعني أن قيم المفاتيح المختلفة قد تكون من أنواع مختلفة. وإذا كان ذلك مطلوبًا في ClickHouse، فحدِّد البنية الهرمية صراحةً باستخدام Tuple أو اعتمد على النوع JSON. | |
ARRAY | Array, Nested | يستخدم ARRAY في Snowflake النوع VARIANT لعناصره، وهو نوع عام. وفي المقابل، تكون هذه العناصر محددة النوع بدقة في ClickHouse. | |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon | يفرض Snowflake نظام إحداثيات (WGS 84)، بينما يطبّقه ClickHouse عند تنفيذ الاستعلام. | |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
| نوع ClickHouse | الوصف |
|---|---|
IPv4 and IPv6 | أنواع مخصّصة لعناوين IP، وقد تتيح تخزينًا أكثر كفاءة من Snowflake. |
FixedString | يتيح استخدام طول ثابت من البايتات، وهو مفيد لقيم hash. |
LowCardinality | يتيح ترميز أي نوع بترميز القاموس. وهو مفيد عندما يُتوقَّع أن يكون عدد القيم الفريدة < 100k. |
Enum | يتيح ترميزًا فعّالًا للقيم المسمّاة ضمن نطاقات 8 أو 16 بت. |
UUID | لتخزين معرّفات UUID بكفاءة. |
Array(Float32) | يمكن تمثيل المتجهات على شكل Array من Float32 مع دوال المسافة المدعومة. |