OPTIMIZE TABLE ... FINAL (راجع هذه الوثائق)، لأن حالة استخدامه مخصصة للأغراض الإدارية، لا للعمليات اليومية.
لا يمكن لـ
OPTIMIZE إصلاح الخطأ Too many parts.OPTIMIZE مدعوم لعائلة MergeTree (بما في ذلك materialized views) ومحركات Buffer. أما محركات الجداول الأخرى فلا يدعمها النظام.
عند استخدام OPTIMIZE مع عائلة محركات الجداول ReplicatedMergeTree، ينشئ ClickHouse مهمة دمج وينتظر تنفيذها على جميع النسخ المتماثلة (إذا كان الإعداد alter_sync مضبوطًا على 2)، أو على النسخ المتماثلة النشطة (إذا كان مضبوطًا على 3) أو على النسخة المتماثلة الحالية (إذا كان مضبوطًا على 1).
- إذا لم يُجرِ
OPTIMIZEعملية دمج لأي سبب، فلن يُخطر العميل بذلك. لتمكين الإشعارات، استخدم الإعداد optimize_throw_if_noop. - إذا حددت
PARTITION، فلن يُحسَّن إلا القسم المحدد. كيفية تعيين تعبير القسم. - إذا حددت
FINALأوFORCE، فستُنفَّذ عملية التحسين حتى إذا كانت جميع البيانات موجودة بالفعل في جزء واحد. يمكنك التحكم في هذا السلوك باستخدام optimize_skip_merged_partitions. كذلك، يُفرَض الدمج حتى إذا كانت هناك عمليات دمج متزامنة قيد التنفيذ. - إذا حددت
DEDUPLICATE، فستُزال الصفوف المتطابقة تمامًا (ما لم تُحدَّد عبارة BY) (تُقارَن جميع الأعمدة)، وهذا مفيد فقط مع محرك MergeTree.
OPTIMIZE باستخدام الإعداد replication_wait_for_inactive_replica_timeout.
إذا كان
alter_sync مضبوطًا على 2 وكانت بعض النسخ المتماثلة غير نشطة لمدة تتجاوز الوقت المحدد في الإعداد replication_wait_for_inactive_replica_timeout، فسيتم طرح الاستثناء UNFINISHED. مع alter_sync = 3 لا يُنتظر وصول النسخ المتماثلة غير النشطة، لذا لا يُطرح أي استثناء.DRY RUN
يحاكي عبارةDRY RUN دمج الأجزاء المحددة من دون تثبيت النتيجة. ويُكتب الجزء المدموج في موقع مؤقت، ثم يُتحقَّق منه ويُتخلَّص منه بعد ذلك. وتبقى الأجزاء الأصلية وبيانات الجدول من دون تغيير.
يفيد ذلك في:
- اختبار صحة الدمج عبر إصدارات ClickHouse.
- إعادة إنتاج الأخطاء المرتبطة بالدمج بصورة حتمية.
- قياس أداء الدمج.
DRY RUN إلا للجداول من عائلة MergeTree. ويُشترط استخدام الكلمة المفتاحية PARTS مع قائمة بأسماء الأجزاء. ويجب أن تكون جميع الأجزاء المحددة موجودة ونشطة وتنتمي إلى القسم نفسه.
لا يتوافق DRY RUN مع FINAL وPARTITION. ويمكن دمجه مع DEDUPLICATE (مع تحديد اختياري للأعمدة) وCLEANUP (لجداول ReplacingMergeTree).
الصياغة
CHECK TABLE. ويخضع هذا السلوك للإعداد optimize_dry_run_check_part (مفعّل افتراضيًا). ويؤدي تعطيله إلى تخطي التحقق، ما قد يكون مفيدًا لاختبار أداء عملية الدمج نفسها.
مثال
تعبير BY
إذا كنت تريد إجراء إزالة التكرار على مجموعة مخصّصة من الأعمدة بدلًا من جميع الأعمدة، فيمكنك تحديد قائمة الأعمدة صراحةً أو استخدام أي مزيج من تعبيرات* وCOLUMNS وEXCEPT. ويجب أن تتضمن قائمة الأعمدة المكتوبة صراحةً أو الموسَّعة ضمنيًا جميع الأعمدة المحددة في تعبير ترتيب الصفوف (أي كلًّا من المفتاح الأساسي ومفتاح الفرز) وتعبير التقسيم (مفتاح التقسيم).
لاحظ أن
* يتصرف تمامًا كما في SELECT: لا تُستخدم الأعمدة MATERIALIZED وALIAS في التوسعة.كما يُعدّ من الأخطاء تحديد قائمة أعمدة فارغة، أو كتابة تعبير ينتج عنه قائمة أعمدة فارغة، أو إجراء إزالة التكرار باستخدام عمود ALIAS.Query
Query
Query
Response
DEDUPLICATE
عندما لا تُحدَّد الأعمدة المستخدمة لإزالة التكرار، تُؤخذ جميعها في الحسبان. ولا يُزال الصف إلا إذا كانت جميع القيم في كل الأعمدة مساويةً للقيم المناظرة في الصف السابق:
Query
Query
Response
DEDUPLICATE BY *
عندما تُحدَّد الأعمدة ضمنيًا، يُزال التكرار من الجدول استنادًا إلى جميع الأعمدة التي ليست ALIAS أو MATERIALIZED. وبالنظر إلى الجدول أعلاه، فهذه هي الأعمدة primary_key وsecondary_key وvalue وpartition_key:
Query
Query
Response
DEDUPLICATE BY * EXCEPT
أزل التكرار بحسب جميع الأعمدة التي ليست ALIAS أو MATERIALIZED، مع استبعاد value صراحةً: أعمدة primary_key وsecondary_key وpartition_key.
Query
Query
Response
DEDUPLICATE BY <list of columns>
أزل التكرار صراحةً استنادًا إلى الأعمدة primary_key وsecondary_key وpartition_key:
Query
Query
Response
DEDUPLICATE BY COLUMNS(<regex>)
أزل التكرار استنادًا إلى جميع الأعمدة التي تطابق تعبيرًا نمطيًا: الأعمدة primary_key وsecondary_key وpartition_key:
Query
Query
Response