يمكنك تعديل استعلام SELECT الذي جرى تحديده عند إنشاء عرض مادي باستخدام التعليمة ALTER TABLE ... MODIFY QUERY من دون مقاطعة عملية الإدخال.
صُمم هذا الأمر لتعديل عرض مادي أُنشئ باستخدام العبارة TO [db.]name. وهو لا يغيّر بنية جدول التخزين الأساسي، كما لا يغيّر تعريف أعمدة العرض المادي، لذلك يكون استخدام هذا الأمر محدودًا جدًا مع العروض المادية التي أُنشئت من دون العبارة TO [db.]name.
مثال مع جدول TO
CREATE TABLE events (ts DateTime, event_type String)
ENGINE = MergeTree ORDER BY (event_type, ts);
CREATE TABLE events_by_day (ts DateTime, event_type String, events_cnt UInt64)
ENGINE = SummingMergeTree ORDER BY (event_type, ts);
CREATE MATERIALIZED VIEW mv TO events_by_day AS
SELECT toStartOfDay(ts) ts, event_type, count() events_cnt
FROM events
GROUP BY ts, event_type;
INSERT INTO events
SELECT DATE '2020-01-01' + interval number * 900 second,
['imp', 'click'][number%2+1]
FROM numbers(100);
SELECT ts, event_type, sum(events_cnt)
FROM events_by_day
GROUP BY ts, event_type
ORDER BY ts, event_type;
┌مثال من دون جدول TO
التطبيق محدود جدًا، إذ لا يمكنك سوى تغيير قسم SELECT من دون إضافة أعمدة جديدة.
CREATE TABLE src_table (`a` UInt32) ENGINE = MergeTree ORDER BY a;
CREATE MATERIALIZED VIEW mv (`a` UInt32) ENGINE = MergeTree ORDER BY a AS SELECT a FROM src_table;
INSERT INTO src_table (a) VALUES (1), (2);
SELECT * FROM mv;┌─a─┐
│ 1 │
│ 2 │
└───┘ALTER TABLE mv MODIFY QUERY SELECT a * 2 as a FROM src_table;
INSERT INTO src_table (a) VALUES (3), (4);
SELECT * FROM mv;┌─a─┐
│ 6 │
│ 8 │
└───┘
┌─a─┐
│ 1 │
│ 2 │
└───┘تعليمة ALTER TABLE … MODIFY REFRESH
تُغيّر ALTER TABLE ... MODIFY REFRESH مَعلمات التحديث الخاصة بـ العرض المادي القابل للتحديث، بما في ذلك الجدول الزمني، والتبعيات، والعشوائية، وإعدادات التحديث.
ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...]الجدول الزمني (EVERY أو AFTER) إلزامي: إذ تستبدل التعليمة جميع معلمات التحديث دفعةً واحدة. وأي عبارة لا تُحدَّد — RANDOMIZE FOR أو DEPENDS ON أو SETTINGS — تُزال أو تُعاد إلى قيمها الافتراضية. ولتغيير إعدادات التحديث فقط، أعِد استخدام الجدول الزمني الحالي.
يُحدِّث الأمر تكوين التحديث للعرض الحالي في موضعه، دون إعادة إنشاء العرض المادي أو جدول الهدف الخاص به، أو مسح بيانات الهدف الحالية، أو إلغاء تحديث قيد التشغيل بالفعل. وتستمر عمليات القراءة من جدول الهدف الحالي أثناء تغيير التكوين.
تكرار الأمر باستخدام مواصفة REFRESH الكاملة نفسها آمن. احرص على تكرار كل عبارة ينبغي أن تظل مُكوَّنة، لأن كل تنفيذ يستبدل جميع معلمات التحديث كما هو موضح أعلاه.
-- Change the schedule.
ALTER TABLE rmv MODIFY REFRESH EVERY 30 MINUTE;
-- Change retry settings (schedule must be repeated).
ALTER TABLE rmv MODIFY REFRESH EVERY 30 MINUTE
SETTINGS refresh_retries = 5,
refresh_retry_initial_backoff_ms = 500,
refresh_retry_max_backoff_ms = 60000;
-- Add or keep a dependency.
ALTER TABLE rmv MODIFY REFRESH EVERY 6 HOUR DEPENDS ON other_rmv;
-- Drop the dependency by omitting `DEPENDS ON`.
ALTER TABLE rmv MODIFY REFRESH EVERY 6 HOUR;القيود:
-
ALTER TABLE ... MODIFY SETTINGغير مدعوم في العروض المادية؛ ولا يمكن تغيير إعدادات التحديث إلا عبرMODIFY REFRESH. - لا يدعم إضافة
APPENDأو إزالته. - لا يمكن تغيير إعداد التحديث
all_replicasبعد إنشاء العرض.
القائمة الكاملة لإعدادات التحديث موثقة في إعدادات التحديث. كما تظهر حالة التحديث، بما في ذلك الإعدادات المطبقة حاليًا، في system.view_refreshes.