ADD INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] ADD INDEX [IF NOT EXISTS] name expression TYPE type [GRANULARITY value] [FIRST|AFTER name] - يضيف وصف الفهرس إلى البيانات الوصفية للجداول.
DROP INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] DROP INDEX [IF EXISTS] name - يزيل وصف الفهرس من البيانات الوصفية للجدول ويحذف ملفات الفهرس من القرص. ويُنفَّذ ذلك على شكل mutation.
MATERIALIZE INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX [IF EXISTS] name [IN PARTITION partition_name] - يعيد بناء الفهرس الثانوي name للقسم partition_name المحدد. يُنفَّذ كتعديلٍ mutation. إذا أُهمل جزء IN PARTITION، فسيُعاد بناء الفهرس لبيانات الجدول كاملةً.
لا يُعد MATERIALIZE COLUMN بديلًا كاملًا عن MATERIALIZE INDEX. في الأجزاء التي تكون عريضة + بتخزين كامل في الوقت نفسه، قد يعيد كتابة قيم الأعمدة دون تحديث ملفات فهارس التخطي (أو الفهارس النصية) المستقلة. وتُستثنى من ذلك فهارس التخطي العادية المخزنة في skp_idx.packed: إذ يمكن مع ذلك فرض إعادة حسابها في الأجزاء العريضة + ذات التخزين الكامل (تدفقات فرعية صغيرة لفهرس التخطي تكون أقل من القيمة الافتراضية لـ packed_skip_index_max_bytes؛ لا تُحزَّم فهارس النص الكامل بهذه الطريقة). في أي جزء لا يكون عريضًا + بتخزين كامل (بما في ذلك مدمج + كامل ومدمج + محزّم وعريض + محزّم)، يمكن لإعادة كتابة الجزء بالكامل إعادة حساب الفهارس الموجودة مسبقًا — فعادةً ما تكون الأجزاء الصغيرة مدمجة، مع أنها تستخدم تخزين الأجزاء الكامل افتراضيًا. استخدم MATERIALIZE INDEX للمسار الحتمي / الفوري عند إضافة فهرس إلى جدول يحتوي بالفعل على بيانات (ADD INDEX للبيانات الوصفية فقط)، وكذلك بعد إعادة كتابة الأعمدة في الأجزاء العريضة+ذات التخزين الكامل عندما تحتاج إلى إعادة بناء ملفات الفهارس المستقلة فورًا. يمكن أيضًا تجسيد الفهارس المضافة حديثًا (بما فيها فهارس النص) في الأجزاء التاريخية عبر عملية دمج لاحقة عند تمكين materialize_skip_indexes_on_merge وعدم استبعاد الفهرس عبر exclude_materialize_skip_indexes_on_merge؛ وإلا فستبقى غير مجسّدة إلى أن يُنفَّذ MATERIALIZE INDEX صراحةً.
CLEAR INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] CLEAR INDEX [IF EXISTS] name [IN PARTITION partition_name] - يحذف ملفات الفهرس الثانوي من القرص دون إزالة الوصف. يُنفَّذ على شكل mutation.
تُعد الأوامر ADD وDROP وCLEAR خفيفة، بمعنى أنها لا تغيّر سوى البيانات الوصفية أو تزيل الملفات.
كما أنها مكررة، إذ تُزامِن البيانات الوصفية للفهارس عبر ClickHouse Keeper أو ZooKeeper.
يُدعَم التعامل مع الفهارس فقط للجداول التي تستخدم المحرك
*MergeTree (بما في ذلك الأنواع replicated).تنفيذ ALTER المتزامن وMATERIALIZE INDEX متعدد العبارات
ALTER المنفصلة والمتتابعة بسرعة على جدول واحد إلى ظهور CANNOT_ASSIGN_ALTER (الشيفرة 517) عندما لا تكون أوامر ALTER السابقة قد طُبّقت بعد على النسخة المتماثلة (إذ تظل البيانات الوصفية متأخرة، وقد يستمر ذلك حتى بعد إسناد أمر alter سابق). هذه حالة عامة تتعلق بتنفيذ ALTER متزامن على البيانات الوصفية/بـmutation، وليست مقتصرة على mutation وحدها؛ نفّذ العمليات بالتسلسل أو أعد المحاولة، وانتظر أوامر alter السابقة التي تُنتج mutation باستخدام mutations_sync / is_done في system.mutations، أو ادمج عمليات البيانات الوصفية المستقلة في أمر ALTER واحد متعدد العبارات عندما تسمح القواعد النحوية بذلك. راجع تزامن استعلامات ALTER وإسناد ALTER المتزامن.
يمكن أن تظهر عدة عبارات MATERIALIZE INDEX ضمن أمر ALTER واحد. الحالة المغطاة في الشيفرة المصدرية هي تجميع عدة عبارات ADD INDEX مع MATERIALIZE INDEX للفهارس الجديدة نفسها في تعليمة واحدة (tests/queries/0_stateless/02911_add_index_and_materialize_index.sql). هذه الصيغة المجمّعة مخصصة لقواعد البيانات العادية (غير DatabaseReplicated)؛ إذ يرفض DatabaseReplicated المقاطع المختلطة من ADD INDEX وMATERIALIZE INDEX باستخدام QUERY_IS_PROHIBITED. أما الصيغ متعددة العبارات التي تقتصر على MATERIALIZE INDEX للفهارس الموجودة مسبقًا، فتتبع في التنفيذ الحالي مسار إعداد لقطة البيانات الوصفية نفسه، لكن هذا الشكل المحدد لا يغطيه بعد اختبار عديم الحالة مخصص؛ لذا اعتبره سلوكًا للتنفيذ الحالي، لا ضمانًا تعاقديًا مستقلًا، إلى أن تتوفر هذه التغطية. وللتطبيق بالترتيب، نفّذ MATERIALIZE INDEX واحدًا في كل تعليمة وانتظر باستخدام mutations_sync.