- يتيح الكتابة السريعة لحالات الكائنات التي تتغير باستمرار.
- يحذف حالات الكائنات القديمة في الخلفية. وهذا يقلل حجم التخزين بشكل كبير.
VersionedCollapsingMergeTree الغرض نفسه الذي يؤديه CollapsingMergeTree، لكنه يستخدم خوارزمية طي مختلفة تتيح إدراج البيانات بأي ترتيب باستخدام عدة خيوط. وعلى وجه الخصوص، يساعد العمود Version على طي الصفوف بشكل صحيح حتى إذا أُدرجت بترتيب غير صحيح. في المقابل، لا يتيح CollapsingMergeTree إلا الإدراج المتتالي الصارم.
إنشاء جدول
معلمات المحرك
بنود الاستعلام
VersionedCollapsingMergeTree، تكون البنود نفسها مطلوبة كما عند إنشاء جدول MergeTree.
الاختزال
البيانات
Sign عند كتابة الصف. إذا كانت قيمة Sign = 1 فهذا يعني أن الصف يمثّل حالة لكائن ما (لنسمّه صف “الحالة”). وإذا كانت قيمة Sign = -1 فهذا يشير إلى إلغاء حالة لكائن له السمات نفسها (لنسمّه صف “الإلغاء”). واستخدم أيضًا العمود Version، الذي ينبغي أن يميّز كل حالة من حالات الكائن برقم مستقل.
على سبيل المثال، لنفترض أننا نريد حساب عدد الصفحات التي زارها المستخدمون على موقع ما، والمدة التي قضوها هناك. في لحظة زمنية معيّنة، نكتب الصف التالي الذي يمثّل حالة نشاط المستخدم:
Sign.
يحتوي الصف الثاني على الحالة الحالية.
وبما أننا نحتاج فقط إلى أحدث حالة لنشاط المستخدم، فإن الصفوف
VersionedCollapsingMergeTree بذلك أثناء دمج أجزاء البيانات.
لمعرفة سبب حاجتنا إلى صفّين لكل تغيير، راجع Algorithm.
ملاحظات حول الاستخدام
- يجب أن يتذكر البرنامج الذي يكتب البيانات حالة الكائن حتى يتمكن من إلغائها. يجب أن يحتوي السطر “إلغاء” على نسخ من حقول المفتاح الأساسي، وإصدار السطر “حالة”، وقيمة
Signالمعاكسة. يزيد ذلك الحجم الأولي للتخزين، لكنه يتيح كتابة البيانات بسرعة. - تؤدي المصفوفات الطويلة والمتزايدة في الأعمدة إلى تقليل كفاءة المحرك بسبب العبء الواقع على عمليات الكتابة. وكلما كانت البيانات أبسط، كانت الكفاءة أفضل.
- تعتمد نتائج
SELECTبدرجة كبيرة على اتساق سجل تغييرات الكائن. كن دقيقًا عند إعداد البيانات للإدراج. فقد تحصل على نتائج غير متوقعة مع البيانات غير المتسقة، مثل القيم السالبة لمقاييس غير سالبة مثل عمق الجلسة.
الخوارزمية
Sign فيهما مختلفة. ولا يهم ترتيب الصفوف.
عندما يُدرِج ClickHouse البيانات، فإنه يرتب الصفوف حسب المفتاح الأساسي. وإذا لم يكن العمود Version ضمن المفتاح الأساسي، يضيفه ClickHouse ضمنيًا إلى المفتاح الأساسي باعتباره الحقل الأخير ويستخدمه في الترتيب.
اختيار البيانات
SELECT باستخدام عدة خيوط تنفيذ، ولا يمكنه التنبؤ بترتيب الصفوف في النتيجة. وهذا يعني أن التجميع مطلوب إذا كانت هناك حاجة إلى الحصول على بيانات “مطوية” بالكامل من جدول VersionedCollapsingMergeTree.
لإتمام الطي، اكتب استعلامًا يتضمن عبارة GROUP BY ودوال تجميع تراعي الإشارة. على سبيل المثال، لحساب الكمية، استخدم sum(Sign) بدلًا من count(). ولحساب مجموع قيمةٍ ما، استخدم sum(Sign * x) بدلًا من sum(x)، وأضف HAVING sum(Sign) > 0.
يمكن حساب count وsum وavg بهذه الطريقة. ويمكن حساب uniq إذا كان للكائن حالة واحدة غير مطوية على الأقل. أما min وmax فلا يمكن حسابهما لأن VersionedCollapsingMergeTree لا يحتفظ بسجل قيم الحالات المطوية.
إذا كنت بحاجة إلى استخراج البيانات مع “الطي” ولكن من دون تجميع (على سبيل المثال، للتحقق مما إذا كانت هناك صفوف تتطابق أحدث قيمها مع شروط معينة)، فيمكنك استخدام المعدِّل FINAL مع عبارة FROM. هذا النهج غير فعّال ويجب عدم استخدامه مع الجداول الكبيرة.
مثال للاستخدام
INSERT لإنشاء جزأَي بيانات مختلفين. وإذا أدرجنا البيانات باستعلام واحد، فسينشئ ClickHouse جزء بيانات واحدًا ولن ينفّذ أي عملية دمج.
جلب البيانات:
INSERT. نُفِّذ استعلام SELECT على خيطَي تنفيذ، وكانت النتيجة ترتيبًا عشوائيًا للصفوف.
لم يحدث الطي لأن أجزاء البيانات لم تُدمج بعد. يدمج ClickHouse أجزاء البيانات في وقت غير معلوم لا يمكننا التنبؤ به.
ولهذا نحتاج إلى التجميع:
FINAL مع عبارة FROM.