الانتقال إلى المحتوى الرئيسي

أنواع البيانات

القيم العددية

سيلاحظ المستخدمون الذين ينقلون البيانات بين ClickHouse وSnowflake فورًا أن ClickHouse يوفّر دقة أكثر تفصيلًا عند تعريف القيم العددية. على سبيل المثال، يوفّر Snowflake النوع Number للقيم العددية. وهذا يتطلب من المستخدم تحديد precision (إجمالي عدد الأرقام) وscale (عدد الأرقام إلى يمين الفاصلة العشرية) بحد أقصى إجمالي يبلغ 38. كما أن تعريفات الأعداد الصحيحة تُعد مرادفةً للنوع Number، وهي ببساطة تحدّد precision وscale ثابتين مع بقاء النطاق نفسه. وتعود هذه السهولة إلى أن تعديل precision (حيث تكون قيمة scale مساوية لـ 0 في الأعداد الصحيحة) لا يؤثر في حجم البيانات على القرص في Snowflake، إذ يُستخدم الحد الأدنى المطلوب من البايتات للنطاق العددي عند الكتابة على مستوى micro partition. أما scale، فهو يؤثر في مساحة التخزين، ويُعوَّض ذلك عبر الضغط. ويوفّر النوع Float64 نطاقًا أوسع من القيم مقابل بعض الفقد في الدقة. في المقابل، يوفّر ClickHouse درجات دقة متعددة، موقّعة وغير موقّعة، للأعداد العائمة والأعداد الصحيحة. وباستخدام هذه الأنواع، يمكنك تحديد مقدار الدقة المطلوبة للأعداد الصحيحة بدقة لتحسين استهلاك التخزين والذاكرة. كما أن النوع Decimal، وهو المكافئ للنوع Number في Snowflake، يوفّر أيضًا ضعف precision وscale ليصل إلى 76 رقمًا. وإضافةً إلى النوع Float64 المماثل، يوفّر ClickHouse أيضًا النوع Float32 للحالات التي تكون فيها الدقة أقل أهمية ويكون الضغط فيها أولوية قصوى.

السلاسل النصية

يتبع ClickHouse وSnowflake نهجين مختلفين في تخزين بيانات السلاسل النصية. يحتفظ VARCHAR في Snowflake بمحارف Unicode بترميز UTF-8، ما يتيح للمستخدم تحديد حد أقصى للطول. ولا يؤثر هذا الطول في التخزين أو الأداء، إذ يُستخدم دائمًا الحد الأدنى من البايتات لتخزين السلسلة النصية، وهو يفرض فقط قيودًا تفيد الأدوات اللاحقة. أما الأنواع الأخرى، مثل Text وNChar، فهي مجرد أسماء بديلة لهذا النوع. وعلى النقيض من ذلك، يخزّن ClickHouse كل بيانات السلاسل النصية كبايتات خام باستخدام النوع String (من دون الحاجة إلى تحديد الطول)، ويترك مسألة الترميز للمستخدم، مع توفّر دوال وقت الاستعلام للتعامل مع الترميزات المختلفة. ونحيل القارئ إلى “Opaque data argument” للاطلاع على الدافع وراء ذلك. لذلك، فإن String في ClickHouse أقرب من حيث التنفيذ إلى النوع Binary في Snowflake. ويدعم كل من Snowflake وClickHouse ميزة “collation”، بما يتيح للمستخدمين تخصيص كيفية فرز السلاسل النصية ومقارنتها.

الأنواع شبه المهيكلة

تدعم Snowflake الأنواع 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 أيضًا قيودًا على الحجم على هذه الأنواع من البيانات.

مرجع الأنواع

SnowflakeClickHouseملاحظة
NUMBERDecimalيدعم ClickHouse دقةً وعددَ منازل عشرية يساويان ضعف ما يتيحه Snowflake — 76 رقمًا مقابل 38.
FLOAT, FLOAT4, FLOAT8Float32, Float64جميع الأعداد ذات الفاصلة العائمة في Snowflake هي من نوع 64 بت.
VARCHARString
BINARYString
BOOLEANBool
DATEDate, 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_TZDateTime وDateTime64يمكن تحديد معلمة TZ اختياريًا للعمود في DateTime وDateTime64. وإذا لم تكن موجودة، تُستخدم المنطقة الزمنية الخاصة بالخادم. بالإضافة إلى ذلك، تتوفر للعميل معلمة --use_client_time_zone.
VARIANTJSON, Tuple, Nestedالنوع JSON لا يزال تجريبيًا في ClickHouse. ويستنتج هذا النوع أنواع الأعمدة عند الإدراج. ويمكن أيضًا استخدام Tuple وNested وArray كبديل لبناء هياكل ذات أنواع محددة صراحةً.
OBJECTTuple, Map, JSONيُماثل كلٌّ من OBJECT وMap النوع JSON في ClickHouse، حيث تكون المفاتيح من النوع String. ويتطلب ClickHouse أن تكون القيم متسقة ومحددة النوع بشكل صارم، بينما تستخدم Snowflake VARIANT. وهذا يعني أن قيم المفاتيح المختلفة قد تكون من أنواع مختلفة. وإذا كان ذلك مطلوبًا في ClickHouse، فحدِّد البنية الهرمية صراحةً باستخدام Tuple أو اعتمد على النوع JSON.
ARRAYArray, Nestedيستخدم ARRAY في Snowflake النوع VARIANT لعناصره، وهو نوع عام. وفي المقابل، تكون هذه العناصر محددة النوع بدقة في ClickHouse.
GEOGRAPHYPoint, Ring, Polygon, MultiPolygonيفرض Snowflake نظام إحداثيات (WGS 84)، بينما يطبّقه ClickHouse عند تنفيذ الاستعلام.
GEOMETRYPoint, Ring, Polygon, MultiPolygon
نوع ClickHouseالوصف
IPv4 and IPv6أنواع مخصّصة لعناوين IP، وقد تتيح تخزينًا أكثر كفاءة من Snowflake.
FixedStringيتيح استخدام طول ثابت من البايتات، وهو مفيد لقيم hash.
LowCardinalityيتيح ترميز أي نوع بترميز القاموس. وهو مفيد عندما يُتوقَّع أن يكون عدد القيم الفريدة < 100k.
Enumيتيح ترميزًا فعّالًا للقيم المسمّاة ضمن نطاقات 8 أو 16 بت.
UUIDلتخزين معرّفات UUID بكفاءة.
Array(Float32)يمكن تمثيل المتجهات على شكل Array من Float32 مع دوال المسافة المدعومة.
وأخيرًا، يوفّر ClickHouse قدرة فريدة على تخزين حالة الدوال التجميعية. وهذه الحالة خاصة بالتنفيذ، لكنها تتيح تخزين نتيجة التجميع ثم الاستعلام عنها لاحقًا (باستخدام دوال الدمج المقابلة). وعادةً ما تُستخدم هذه الميزة عبر عرض مادي، وكما هو موضح أدناه، فهي تتيح إمكانية تحسين أداء استعلامات محددة بأقل تكلفة تخزين ممكنة من خلال تخزين النتيجة التزايدية للاستعلامات على البيانات المُدرجة (مزيد من التفاصيل هنا).
آخر تعديل في ٢٥ يونيو ٢٠٢٦