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

التحقق من المفتاح الأساسي

قد يلاحظ المستخدمون أحيانًا أن استعلاماتهم أبطأ من المتوقع، رغم اعتقادهم أنهم يجرون الترتيب أو التصفية باستخدام مفتاح أساسي. في هذه المقالة نوضح كيف يمكنهم التأكد من استخدام المفتاح، مع تسليط الضوء على الأسباب الشائعة لعدم استخدامه.

إنشاء جدول

لنأخذ الجدول البسيط التالي:
لاحظ كيف يتضمّن مفتاح الترتيب لدينا toUnixTimestamp(timestamp) بوصفه العنصر الثاني.

تعبئة البيانات

عبّئ هذا الجدول بـ 100 مليون صف:

التصفية الأساسية

إذا قمنا بالتصفية حسب code، فسنرى في الناتج عدد الصفوف التي جرى فحصها: 49.15 thousand. لاحظ أن هذا يمثّل مجموعة فرعية من إجمالي 100m صف.
علاوة على ذلك، يمكننا أيضًا التأكد من استخدام الفهرس عبر البند EXPLAIN indexes=1:
لاحظ كيف أن عدد الـ حبيبات التي جرى فحصها، 8012، لا يمثّل سوى جزء من الإجمالي 12209. ويؤكد القسم المميز أدناه استخدام شيفرة المفتاح الأساسي.
تُعدّ الحبيبات وحدة معالجة البيانات في ClickHouse، وعادةً ما تحتوي كل واحدة منها على 8192 صفًا. ولمزيد من التفاصيل حول الحبيبات وكيفية ترشيحها، نوصي بقراءة هذا الدليل.
لن تكون التصفية على المفاتيح المتأخرة ضمن مفتاح الترتيب بالكفاءة نفسها التي تكون عليها التصفية على المفاتيح الأسبق في الـ tuple. ولمعرفة السبب، راجع هنا

التصفية باستخدام مفاتيح متعددة

لنفترض أننا نُجري التصفية وفقًا لـcode وtimestamp:
في هذه الحالة، يُستخدم مفتاحا الترتيب كليهما لتصفية الصفوف، ما يعني الحاجة إلى قراءة 87 حبيبة فقط.

استخدام المفاتيح في الفرز

يمكن لـ ClickHouse أيضًا الاستفادة من مفاتيح الترتيب لتنفيذ الفرز بكفاءة. وتحديدًا، عندما يكون الإعداد optimize_read_in_order مُمكّنًا (وهو كذلك افتراضيًا)، يستخدم خادم ClickHouse فهرس الجدول ويقرأ البيانات وفقًا لترتيب مفتاح ORDER BY. يتيح ذلك تجنّب قراءة جميع البيانات عند تحديد LIMIT. لذلك، تُعالَج الاستعلامات على مجموعات البيانات الكبيرة ذات الحدود الصغيرة بسرعة أكبر. راجع هنا وهنا لمزيد من التفاصيل. ومع ذلك، يتطلب هذا تطابق المفاتيح المستخدمة. على سبيل المثال، انظر إلى هذا الاستعلام:
يمكننا التأكد من عدم الاستفادة من هذا التحسين هنا باستخدام EXPLAIN pipeline:
السطر MergeTreeSelect(pool: ReadPool, algorithm: Thread) هنا لا يدل على استخدام هذا التحسين، بل على عملية قراءة عادية. ويرجع ذلك إلى أن مفتاح ترتيب الجدول لدينا يستخدم toUnixTimestamp(Timestamp) وليس timestamp. ويؤدي تصحيح هذا الاختلاف إلى حل المشكلة:
آخر تعديل في ٢ يوليو ٢٠٢٦