التحليلات اللحظيةمستودعات البياناتالرصدAI/MLCloudOss
المتطلبات الأساسية
- A running ClickHouse Cloud service. If you don’t have one yet, complete the Create your first Cloud service quickstart first.
uk_price_paid والمفاهيم المقدَّمة فيها:
ما الذي ستبنيه
uk_price_paid حسب town أو county يتطلب فحصًا كاملًا للجدول لأن الجدول مُرتَّب وفق (postcode, addr1, addr2).
في دليل البدء السريع هذا، ستحل هذه المشكلة بإنشاء إسقاط — وهو تمثيل إضافي مُرتَّب لبياناتك ومخزَّن داخل الجدول نفسه. وخلافًا للعروض المادية، لا تتطلب الإسقاطات أي جدول وجهة منفصل، وتبقى متزامنة مع التعديلات (الحذف والتحديث)، ويستخدمها مُحسِّن الاستعلامات بشفافية، بحيث تواصل الاستعلام باستخدام اسم الجدول نفسه.
وبحلول النهاية، ستفهم كيفية إضافة إسقاط وتفعيل تجسيده، وكيف يختاره ClickHouse تلقائيًا، ومتى تختار الإسقاطات بدلًا من العروض المادية.
1
افهم سبب حاجتك إلى إسقاط
يُفرز جدولuk_price_paid حسب (postcode, addr1, addr2). وهذا يعني أن ClickHouse يستطيع تخطي كتل كبيرة من البيانات عند التصفية حسب postcode أو addr1 أو addr2، لكن الاستعلامات التي تُصفّي حسب town يجب أن تفحص كل الصفوف — أي 30 مليون صف بالكامل.يخزّن الإسقاط نسخة إضافية مفروزة من بعض الأعمدة أو كلها داخل الجدول نفسه. وعند الاستعلام من الجدول، يتحقق مُحسِّن الاستعلامات تلقائيًا مما إذا كانت القراءة من الإسقاط ستتطلب عددًا أقل من الـ granules مقارنةً بالبيانات الأساسية، ويستخدمه تلقائيًا إذا كان الأمر كذلك.الاختلافات الأساسية عن العروض المادية:- لا يوجد جدول منفصل - فالإسقاط موجود داخل
uk_price_paidنفسه - تحسين شفاف للاستعلامات - تستعلم من
uk_price_paidكالمعتاد، ويتولى ClickHouse اختيار الإسقاط تلقائيًا - يبقى متزامنًا مع mutations - تنعكس عمليات الحذف والتحديث المطبقة على الجدول في الإسقاط
2
أضف إسقاطًا إلى جدولك
عرّف إسقاطًا علىuk_price_paid يخزّن town وdate وprice وtype مرتبةً حسب (town, date):PROJECTION uk_price_paid_by_town في المخرجات.3
تجسيد الإسقاط للبيانات الحالية
مثل العروض المُجسَّدة، لا يُطبَّق الإسقاط المُضاف حديثًا إلا على عمليات الإدراج اللاحقة. ولملئه بـ30 مليون صف موجودة بالفعل في الجدول، قم بتجسيده صراحةً:is_done = 1، يكون الإسقاط قد تم تخزينه فعليًا بالكامل. ويمكنك أيضًا التحقق من ذلك بفحص system.projection_parts:4
نفّذ استعلامًا على الجدول ولاحظ الاستخدام التلقائي للإسقاط
الآن نفّذ استعلامًا مع التصفية حسبtown على نفس الجدول الذي تجري عليه استعلاماتك دائمًا:uk_price_paid_by_town بدلًا من فحص البيانات الأساسية.يمكنك التأكد من استخدام الإسقاط عبر EXPLAIN:ReadFromMergeTree مع الإشارة إلى اسم الإسقاط. إذا أردت مقارنة الأداء مباشرةً، يمكنك تعطيل تحسين الإسقاط لاستعلام واحد:5
قارن بين الإسقاطات والعروض المادية
تعالج الإسقاطات والعروض المادية المشكلة نفسها، وهي تسريع عمليات القراءة لأنماط الوصول البديلة، لكن لكلٍّ منهما مفاضلات مختلفة. باختصار، تكون الإسقاطات هي الخيار الأفضل عندما تحتاج فقط إلى ترتيب فرز مختلف للبيانات نفسها؛ أما العروض المادية فهي أكثر مرونة عندما تحتاج إلى تحويل البيانات أو تجميعها أو توجيهها إلى مخطط مختلف. ولمقارنة مفصلة، راجع العروض المادية مقابل الإسقاطات.6
راقب الأثر الإضافي على التخزين
تخزّن الإسقاطات نسخةً ثانية من الأعمدة المحددة داخل الجدول نفسه، مما يزيد من استخدام القرص. استعلم منsystem.parts للاطلاع على الحجم الإجمالي لـ uk_price_paid (والذي يتضمن الآن بيانات الإسقاط):الخطوات التالية
في دليل البدء السريع هذا، أضفتَ إسقاط إلىuk_price_paid يخزّن البيانات مرتبةً حسب (town, date)، مما يتيح عمليات lookup سريعة حسب البلدة دون إنشاء table منفصل. وتعلّمتَ أن مُحسِّن الاستعلامات يختار إسقاط تلقائيًا، وأنها تبقى متزامنة مع mutations، وتستبدل مساحة disk بأداء read أفضل.
اطّلع بعد ذلك على أدلة البدء السريع التالية:
أو تعمّق أكثر بالرجوع إلى وثائق Reference:
