عرض عادي
العرض ذو المعلمات
العرض المادي
OR REPLACE وIF NOT EXISTS لا يمكن استخدامهما معًا: فالجمع بينهما يؤدي إلى خطأ نحوي.
CREATE OR REPLACE MATERIALIZED VIEW
CREATE OR REPLACE MATERIALIZED VIEW بشكل ذري عرضًا ماديًا موجودًا وجدول التخزين الداخلي الخاص به (إن وُجد). وتتطلب هذه العملية محرك قاعدة بيانات Atomic أو Replicated.
- بدون بند
TO: يُحذف الجدول الداخلي القديم ويُنشأ جدول جديد. وتُفقد البيانات الموجودة في الجدول الداخلي ما لم يتم تحديدPOPULATE. - مع بند
TO: يُستبدل تعريف الـ view فقط؛ ولا يتأثر الجدول الهدف أو بياناته. - متوافق مع
REFRESHوON CLUSTERوجميع خيارات المحرك. ولا يكونPOPULATEمدعومًا إلا في قواعد البياناتAtomic— ويُرفض في قواعد البياناتReplicated(راجع ملاحظةPOPULATEأدناه). - يتطلب امتيازي
CREATE VIEWوDROP VIEW.
لا يكون
CREATE OR REPLACE MATERIALIZED VIEW مدعومًا إلا مع محركات قواعد البيانات Atomic أو Replicated. وهو غير مدعوم مع محرك قاعدة البيانات Ordinary.TO [db].[table]، يجب تحديد ENGINE — وهو محرك الجدول المستخدم لتخزين البيانات.
عند إنشاء عرض مادي باستخدام TO [db].[table]، لا يمكنك أيضًا استخدام POPULATE.
يُنفَّذ العرض المادي على النحو التالي: عند إدراج البيانات في الجدول المحدد في SELECT، يُحوَّل جزء من البيانات المُدرَجة بواسطة استعلام SELECT هذا، ثم تُدرَج النتيجة في العرض.
تستخدم العروض المادية في ClickHouse أسماء الأعمدة بدلًا من ترتيب الأعمدة عند الإدراج في جدول الوجهة. وإذا لم تكن بعض أسماء الأعمدة موجودة في نتيجة استعلام
SELECT، فإن ClickHouse يستخدم قيمة افتراضية، حتى إذا لم يكن العمود من النوع Nullable. ومن الممارسات الآمنة إضافة أسماء مستعارة لكل عمود عند استخدام العروض المادية.تُنفَّذ العروض المادية في ClickHouse بطريقة أقرب إلى مشغلات الإدراج. وإذا وُجد أي تجميع في استعلام العرض، فإنه يُطبَّق فقط على دفعة البيانات المُدرجة حديثًا. وأي تغييرات على البيانات الموجودة مسبقًا في الجدول المصدر (مثل update أو delete أو drop partition وما إلى ذلك) لا تغيّر العرض المادي.لا تتمتع العروض المادية في ClickHouse بسلوك حتمي عند حدوث أخطاء. وهذا يعني أن الكتل التي كُتبت بالفعل ستبقى محفوظة في جدول الوجهة، لكن جميع الكتل التي تأتي بعد الخطأ لن تُحفَظ.افتراضيًا، إذا تسببت الكتابة إلى أحد العروض في حدوث استثناء، فإن استعلام INSERT يفشل. وليس هناك ما يضمن ما إذا كانت الكتلة قد وصلت بالفعل إلى الجدول المصدر عند تلك النقطة — إذ يعتمد ذلك على توقيت مسار الإدراج، لا على خطأ العرض. أعد محاولة تنفيذ INSERT الذي فشل باستخدام إزالة تكرار الإدراج (insert_deduplicate, deduplicate_blocks_in_dependent_materialized_views) للحصول على تسليم exactly-once إلى الجدول المصدر وجميع العروض التابعة.إن تعيين materialized_views_ignore_errors=true في استعلام INSERT يغيّر فقط طريقة الإبلاغ عن الأخطاء: إذ يُسجَّل خطأ كل عرض على أنه تحذير وينجح استعلام INSERT. ويكون التسليم إلى وجهة العرض الفاشل جزئيًا — إذ تُحفَظ الكتل التي عولجت قبل الاستثناء، بينما تُسقَط الكتلة الفاشلة وأي كتل لاحقة من ذلك العرض. ولا ترى العروض التابعة لتلك الوجهة إلا الكتل التي وصلت فعلًا، لذا يكون تسليمها جزئيًا أيضًا. أما العروض الشقيقة (وسلاسلها التابعة) التي لم يحدث فيها استثناء فتُكتَب بالكامل، ويُكتَب إلى الجدول المصدر كالمعتاد. ونظرًا لأن INSERT يُبلِغ عن النجاح، فلن يتلقى العميل أي إشارة إلى الفشل ولن تُفعَّل أي إعادة محاولة تلقائية؛ لذا لا تستخدم هذا الإعداد إلا عندما يجب ألا تُحجَب عمليات الكتابة إلى الجدول المصدر بسبب مشكلات في جهة العرض (على سبيل المثال، جداول system.*_log).تكون القيمة الافتراضية لـ materialized_views_ignore_errors هي true بالنسبة إلى جداول system.*_log.POPULATE، فستُدرَج بيانات الجدول الموجودة مسبقًا في العرض عند إنشائه، كما لو كنت تنفذ CREATE TABLE ... AS SELECT .... وإلا، فسيقتصر الاستعلام على البيانات المُدرجة في الجدول بعد إنشاء العرض. نحن لا نوصي باستخدام POPULATE، لأن البيانات المُدرجة في الجدول أثناء إنشاء العرض لن تُدرج فيه.
نظرًا إلى أن
POPULATE يعمل مثل CREATE TABLE ... AS SELECT ...، فله القيود التالية:- غير مدعوم مع Replicated database
- غير مدعوم في ClickHouse Cloud
INSERT ... SELECT منفصل.SELECT على DISTINCT وGROUP BY وORDER BY وLIMIT. لاحظ أن التحويلات المقابلة تُنفَّذ بشكل مستقل على كل كتلة من البيانات المُدرجة. فعلى سبيل المثال، إذا كان GROUP BY مضبوطًا، تُجمَّع البيانات أثناء الإدراج، ولكن فقط ضمن حزمة واحدة من البيانات المُدرجة. ولن تُجمَّع البيانات لاحقًا. والاستثناء هو عند استخدام ENGINE ينفذ تجميع البيانات بشكل مستقل، مثل SummingMergeTree.
إذا كان العرض المادي يستخدم البنية TO [db.]name، فيمكنك DETACH العرض، ثم تشغيل ALTER على الجدول الهدف، ثم ATTACH العرض الذي فُصل (DETACH) سابقًا.
لاحظ أن العرض المادي يتأثر بإعداد optimize_on_insert. إذ تُدمَج البيانات قبل إدراجها في العرض.
تبدو العروض مثل الجداول العادية. فعلى سبيل المثال، تُدرَج في نتيجة استعلام SHOW TABLES.
لحذف عرض، استخدم DROP VIEW. مع أن DROP TABLE يعمل مع VIEW أيضًا.
أمان SQL
DEFINER وSQL SECURITY تحديد مستخدم ClickHouse الذي سيُستخدم عند تنفيذ الاستعلام الأساسي للعرض.
لـ SQL SECURITY ثلاث قيم مسموح بها: DEFINER أو INVOKER أو NONE. ويمكنك تحديد أي مستخدم موجود أو CURRENT_USER في عبارة DEFINER.
يوضح الجدول التالي الصلاحيات المطلوبة لكل مستخدم لكي يتمكن من إجراء SELECT من العرض.
لاحظ أنه بغض النظر عن خيار SQL SECURITY، يبقى من الضروري في جميع الحالات امتلاك GRANT SELECT ON <view> للقراءة منه.
| خيار أمان SQL | العرض | العرض المادي |
|---|---|---|
DEFINER alice | يجب أن يمتلك alice صلاحية SELECT على جدول المصدر الخاص بالعرض. | يجب أن يمتلك alice صلاحية SELECT على جدول المصدر الخاص بالعرض وصلاحية INSERT على الجدول الهدف الخاص بالعرض. |
INVOKER | يجب أن يمتلك المستخدم صلاحية SELECT على جدول المصدر الخاص بالعرض. | لا يمكن تحديد SQL SECURITY INVOKER للعروض المادية. |
NONE | - | - |
يُعد الخيار
SQL SECURITY NONE خيارًا Deprecated. سيتمكن أي مستخدم لديه صلاحية إنشاء عروض باستخدام SQL SECURITY NONE من تنفيذ أي query عشوائي.
لذلك، يلزم وجود GRANT ALLOW SQL SECURITY NONE TO <user> لإنشاء عرض باستخدام هذا الخيار.DEFINER/SQL SECURITY، فستُستخدم القيم الافتراضية:
SQL SECURITY:INVOKERللعروض العادية وDEFINERللعروض المادية (قابل للتهيئة عبر الإعدادات)DEFINER:CURRENT_USER(قابل للتهيئة عبر الإعدادات)
DEFINER/SQL SECURITY، فستكون القيمة الافتراضية هي SQL SECURITY NONE للعرض المادي وSQL SECURITY INVOKER للعرض العادي.
لتغيير أمان SQL لعرض موجود، استخدم
أمثلة
Live View
العرض المادي القابل للتحديث
interval عبارة عن سلسلة من الفترات البسيطة:
REFRESH واحدًا على الأقل من EVERY أو AFTER أو DEPENDS ON. ويُرفض استخدام REFRESH المجرّد (من دون أيٍّ من هذه العناصر). كما أن REFRESH DEPENDS ON ... من دون EVERY/AFTER هو اختصار لـ REFRESH AFTER 0 SECOND DEPENDS ON ...؛ راجع تبعيات التحديث أدناه.
يشغِّل الاستعلام المقابل دوريًا ويخزّن نتيجته في جدول.
- إذا تم تحديد
APPEND، فإن كل عملية تحديث تُدرِج صفوفًا في الجدول من دون حذف الصفوف الموجودة. ولا تكون عملية الإدراج ذرّية، تمامًا مثل استعلامINSERT INTO ... SELECTالعادي. - بخلاف ذلك، يستبدل كل تحديث محتويات الجدول السابقة بشكل ذرّي.
- لا يوجد مشغّل إدراج. عند إدراج بيانات جديدة في الجدول المحدد في
SELECT، لا يتم تمريرها تلقائيًا إلى العرض المادي القابل للتحديث. وبدلًا من ذلك، لا يحدث إدراج البيانات إلا أثناء تشغيل عمليات التحديث الدورية أو اليدوية. - لا توجد قيود على استعلام
SELECT. دوال الجداول (مثلurl())، والعروض، وUNION، وJOIN، كلها مسموح بها.
الإعدادات الموجودة في جزء
REFRESH ... SETTINGS من الاستعلام هي إعدادات التحديث (مثل refresh_retries)، وهي مختلفة عن الإعدادات العادية (مثل max_threads). ويمكن تحديد الإعدادات العادية باستخدام SETTINGS في نهاية الاستعلام.جدولة التحديث
RANDOMIZE FOR بضبط وقت كل عملية تحديث عشوائيًا، على سبيل المثال:
REFRESH EVERY 1 MINUTE يستغرق دقيقتين لإجراء التحديث، فسيُحدَّث كل دقيقتين فقط. وإذا أصبح بعد ذلك أسرع وبدأ التحديث خلال 10 ثوانٍ، فسيعود إلى التحديث كل دقيقة. (وعلى وجه الخصوص، لن يُحدَّث كل 10 ثوانٍ لتعويض تحديثات فائتة متراكمة — إذ لا يوجد أصلًا مثل هذا التراكم.)
عادةً ما يبدأ أول تحديث فور إنشاء الـ materialized view: إذ يكون الوقت منذ آخر تحديث لانهائيًا، لذا يشير أي schedule إلى أن وقت التحديث قد حان الآن. إذا تم تحديد EMPTY، فسيتم تخطي هذا التحديث الأولي، وسيحدث أول تحديث في الوقت المجدول التالي؛ فعلى سبيل المثال، مع EVERY 1 HOUR سيحدث أول تحديث عند نهاية الساعة الحالية.
في قاعدة بيانات Replicated
APPEND، يمكن تعطيل التنسيق باستخدام SETTINGS all_replicas = 1. وهذا يجعل النُسخ المتماثلة تنفّذ عمليات التحديث بشكل مستقل عن بعضها البعض. وفي هذه الحالة، لا يكون ReplicatedMergeTree مطلوبًا.
في الوضع غير APPEND، لا يُدعَم إلا التحديث المنسَّق. أما إذا أردت تحديثًا غير منسَّق، فاستخدم قاعدة بيانات Atomic واستعلام CREATE ... ON CLUSTER لإنشاء عروض مادية قابلة للتحديث على جميع النُسخ المتماثلة.
يتم التنسيق عبر Keeper. ويُحدَّد مسار znode بواسطة إعداد الخادم default_replica_path.
تبعيات إعادة التحديث
DEPENDS ON يزامن عمليات إعادة التحديث بين الجداول المختلفة:
لا تعمل
DEPENDS ON إلا بين العروض المادية القابلة للتحديث. وعلى وجه الخصوص، إذا كان عرض التبعية يستخدم TO <table>، فتأكد من استخدام اسم العرض لا اسم الجدول. وإذا كانت قائمة DEPENDS ON تتضمن جدولًا عاديًا أو عرضًا غير قابل للتحديث أو تحتوي على خطأ مطبعي، فلن يتم تحديث العرض أبدًا، وستظهر حالته MissingDependencies في system.view_refreshes. ويمكن تغيير التبعيات أو إزالتها باستخدام ALTER، راجع تغيير معلمات التحديث.استخدام DEPENDS ON لتحقيق زمن انتشار متسق
REFRESH EVERY بالفترة نفسها، فستُطبَّق التبعية في كل فترة زمنية.
على سبيل المثال، افترض أن العرضين X وY يستخدمان كلاهما REFRESH EVERY 1 HOUR، وأن Y يقرأ من جدول المخرجات الخاص بـ X. من دون تبعيات، سيرى Y عادةً بيانات X الناتجة عن عملية refresh الخاصة بالساعة السابقة. ومع DEPENDS ON X، لن تبدأ عملية refresh الخاصة بـ Y عند الساعة 11:00 إلا بعد اكتمال عملية refresh الخاصة بـ X عند الساعة 11:00.
استخدام DEPENDS ON في معالجة التدفق على دفعات
REFRESH EVERY، فسيُحدَّث العرض التابع X إذا كانت جميع تبعياته قد تحدّثت مرة واحدة على الأقل منذ آخر تحديث لـ X. ويضيف REFRESH AFTER T تأخيرًا: إذ سيبدأ العنصر التابع التحديث بعد مرور مدة T على اكتمال تحديث التبعية.
التبعيات الدائرية مسموح بها ومفيدة. تأمّل هذا الرسم البياني للعروض المادية القابلة للتحديث:
- يأخذ X دفعة من الصفوف من تدفقٍ ما ويضعها في جدول.
- ثم يقرأ كلٌّ من Y وZ من ذلك الجدول، ويُجريان عمليات تجميع مختلفة، ويضيفان النتائج إلى جداول أخرى.
- بعد اكتمال معالجة الدفعة بالكامل، يأخذ X الدفعة التالية، وتتكرر الدورة.
SYSTEM REFRESH VIEW يدويًا بعد كل إعادة تشغيل بدلًا من تنفيذه مرة واحدة فقط بعد إنشاء العروض.
إعدادات التحديث
refresh_retries- عدد مرات إعادة المحاولة إذا فشل استعلام التحديث بسبب استثناء. إذا فشلت جميع محاولات إعادة المحاولة، فانتقل إلى وقت التحديث المجدول التالي. تعني القيمة 0 عدم إعادة المحاولة، وتعني القيمة -1 إعادة المحاولة بلا حدود. القيمة الافتراضية: 2.refresh_retry_initial_backoff_ms- مدة التأخير قبل أول إعادة محاولة، إذا لم تكن قيمةrefresh_retriesصفراً. تتضاعف مدة التأخير مع كل إعادة محاولة لاحقة، حتىrefresh_retry_max_backoff_ms. القيمة الافتراضية: 100 مللي ثانية.refresh_retry_max_backoff_ms- الحد الأقصى للزيادة الأسية في مدة التأخير بين محاولات التحديث. القيمة الافتراضية: 60000 مللي ثانية (دقيقة واحدة).all_replicas- في قاعدة بيانات Replicated معAPPEND، يحدّد ما إذا كانت جميع النسخ المتماثلة تُحدَّث بشكل مستقل، أو ما إذا كانت نسخة متماثلة واحدة فقط تُجري التحديث في كل وقت مجدول. لا يمكن تغيير هذا الإعداد بعد إنشاء العرض. القيمة الافتراضية:false.
تغيير معلمات التحديث
ALTER TABLE ... MODIFY REFRESH:
EVERY أو AFTER) إلزامية: تستبدل التعليمة دائمًا جميع مَعلمات التحديث — الجدولة، وRANDOMIZE FOR، وDEPENDS ON، وإعدادات التحديث — بما هو محدد. وأي عنصر يُغفَل يُعاد تعيينه إلى قيمته الافتراضية (بالنسبة إلى الإعدادات) أو يُزال (بالنسبة إلى التبعيات والعشوائية).
-
لتغيير إعدادات التحديث فقط (مثلًا
refresh_retries)، أعِد ذكر الجدولة الحالية: -
لا يدعم
ALTER TABLE ... MODIFY SETTING refresh_retries = ...العروض المادية؛ ويجب تنفيذ ذلك عبرMODIFY REFRESH. -
لا تتمّ إضافة
APPENDأو إزالته. -
لا يمكن تغيير الإعداد
all_replicasبعد الإنشاء.
عمليات أخرى
system.view_refreshes. ويعرض هذا الجدول تحديدًا تقدّم التحديث (إذا كان جاريًا)، ووقت آخر تحديث ووقت التحديث التالي، ورسالة الاستثناء إذا فشل التحديث.
لإيقاف التحديثات أو بدئها أو تشغيلها أو إلغائها يدويًا، استخدم SYSTEM STOP|START|REFRESH|WAIT|CANCEL VIEW.
للانتظار حتى يكتمل التحديث، استخدم SYSTEM WAIT VIEW. ويكون هذا مفيدًا بشكل خاص عند انتظار التحديث الأولي بعد إنشاء العرض.
معلومة طريفة: يُسمح لاستعلام التحديث بالقراءة من العرض الذي يجري تحديثه، مع الاطّلاع على نسخة البيانات السابقة للتحديث. وهذا يعني أنه يمكنك تنفيذ لعبة الحياة لكونواي: https://pastila.nl/?00021a4b/d6156ff819c83d490ad2dcec05676865#O0LGWTO7maUQIA4AcGUtlA==
Window View
هذه ميزة تجريبية وقد تتغير في الإصدارات القادمة على نحوٍ غير متوافق مع الإصدارات السابقة. لتمكين استخدام Window View واستعلام
WATCH، استخدم الإعداد allow_experimental_window_view. أدخل الأمر set allow_experimental_window_view = 1.WATCH.
يشبه إنشاء window view إنشاء MATERIALIZED VIEW. وتحتاج window view إلى محرك تخزين داخلي لتخزين البيانات الوسيطة. ويمكن تحديد التخزين الداخلي باستخدام العبارة INNER ENGINE، وستستخدم window view المحرك AggregatingMergeTree بوصفه المحرك الداخلي الافتراضي.
عند إنشاء window view بدون TO [db].[table]، يجب تحديد ENGINE — أي محرك الجدول المستخدم لتخزين البيانات.
دوال النافذة الزمنية
سمات الوقت
time_attr في دالة النافذة الزمنية إلى عمود في جدول، أو باستخدام الدالة now(). ينشئ الاستعلام التالي Window view باستخدام وقت المعالجة.
WATERMARK.
توفّر window view ثلاث استراتيجيات للعلامة المائية:
STRICTLY_ASCENDING: تُصدر علامة مائية تساوي أكبر طابع زمني تمّت ملاحظته حتى الآن. ولا تُعد الصفوف التي تحمل طابعًا زمنيًا أصغر من أكبر طابع زمني متأخرة.ASCENDING: تُصدر علامة مائية تساوي أكبر طابع زمني تمّت ملاحظته حتى الآن ناقص 1. ولا تُعد الصفوف التي تحمل طابعًا زمنيًا مساويًا لأكبر طابع زمني أو أصغر منه متأخرة.BOUNDED: WATERMARK=INTERVAL. تُصدر علامات مائية تساوي أكبر طابع زمني تمّت ملاحظته مطروحًا منه التأخير المحدد.
WATERMARK:
ALLOWED_LATENESS=INTERVAL. ومثال على التعامل مع التأخر هو:
SELECT الذي جرى تحديده في window view باستخدام تعليمة ALTER TABLE ... MODIFY QUERY. يجب أن تكون بنية البيانات الناتجة عن استعلام SELECT الجديد مماثلة لبنية استعلام SELECT الأصلي، سواء وُجد بند TO [db.]name أم لم يوجد. لاحظ أن البيانات في النافذة الحالية ستُفقد لأن الحالة الوسيطة لا يمكن إعادة استخدامها.
مراقبة النوافذ الجديدة
TO لإخراج النتائج إلى جدول.
LIMIT لتعيين عدد التحديثات التي سيتم تلقيها قبل إنهاء الاستعلام. ويمكن استخدام العبارة EVENTS للحصول على صيغة مختصرة من استعلام WATCH، بحيث ستحصل بدلًا من نتيجة الاستعلام على أحدث علامة مائية للاستعلام فقط.
الإعدادات
window_view_clean_interval: فاصل تنظيف Window View بالثواني لتحرير البيانات القديمة. سيحتفظ النظام بالنوافذ التي لم تُطلق بالكامل وفقًا لوقت النظام أو إعدادWATERMARK، وسيُحذف ما عدا ذلك من البيانات.window_view_heartbeat_interval: فاصل نبضات الحياة بالثواني للإشارة إلى أن استعلام watch لا يزال نشطًا.wait_for_window_view_fire_signal_timeout: المهلة الزمنية لانتظار إشارة إطلاق Window View في معالجة وقت الحدث.
مثال
data، ويكون هيكل الجدول كما يلي:
WATCH للحصول على النتائج.
data،
WATCH النتائج كما يلي:
TO.
*window_view*).
استخدامات Window View
- المراقبة: تجميع سجلات المقاييس وحسابها بحسب الوقت، ثم إخراج النتائج إلى جدول الهدف. ويمكن أن تستخدم لوحة المعلومات جدول الهدف بوصفه الجدول المصدر.
- التحليل: تجميع البيانات تلقائيًا ومعالجتها مسبقًا ضمن النافذة الزمنية. وقد يكون ذلك مفيدًا عند تحليل عدد كبير من السجلات. وتُلغي المعالجة المسبقة العمليات الحسابية المتكررة عبر استعلامات متعددة وتقلل زمن استجابة الاستعلامات.
- مدونة: العمل مع بيانات السلاسل الزمنية في ClickHouse
- مدونة: بناء حل Observability باستخدام ClickHouse - الجزء 2 - التتبعات
عروض مؤقتة
- بعمر الجلسة لا يوجد عرض مؤقت إلا طوال مدة الجلسة الحالية. وتُحذف تلقائيًا عند انتهاء الجلسة.
- بدون قاعدة بيانات لا يمكنك إلحاق عرض مؤقت باسم قاعدة بيانات. فهي توجد خارج قواعد البيانات (ضمن نطاق الجلسة).
-
غير مُكرّرة / بدون ON CLUSTER
الكائنات المؤقتة محلية بالنسبة إلى الجلسة، ولا يمكن إنشاؤها باستخدام
ON CLUSTER. - حلّ الأسماء إذا كان لكائن مؤقت (جدول أو طريقة عرض) الاسم نفسه لكائن دائم، وأشار استعلام إلى الاسم من دون قاعدة بيانات، فسيُستخدم الكائن المؤقت.
-
كائن منطقي (بدون تخزين)
لا يخزّن عرض مؤقت سوى نص
SELECTالخاص بها (وتستخدم داخليًا تخزينView). وهي لا تحتفظ بالبيانات ولا تقبلINSERT. -
عبارة
ENGINEلا تحتاج إلى تحديدENGINE؛ وإذا تم توفيره على هيئةENGINE = View، فسيتم تجاهله أو التعامل معه باعتباره طريقة العرض المنطقية نفسها. -
الأمان / الامتيازات
يتطلب إنشاء عرض مؤقت الامتياز
CREATE TEMPORARY VIEW، والذي يُمنح ضمنيًا بواسطةCREATE VIEW. -
SHOW CREATE
استخدم
SHOW CREATE TEMPORARY VIEW view_name;لطباعة DDL الخاص بعرض مؤقت.
الصيغة
OR REPLACE غير مدعوم للعروض المؤقتة (تماشيًا مع الجداول المؤقتة). إذا كنت بحاجة إلى “استبدال” عرض مؤقت، فاحذفها ثم أنشئها من جديد.
أمثلة
غير المسموح به / القيود
CREATE OR REPLACE TEMPORARY VIEW ...→ غير مسموح (استخدمDROP+CREATE).CREATE TEMPORARY MATERIALIZED VIEW .../WINDOW VIEW→ غير مسموح.CREATE TEMPORARY VIEW db.view AS ...→ غير مسموح (من دون محدِّد قاعدة بيانات).CREATE TEMPORARY VIEW view ON CLUSTER 'name' AS ...→ غير مسموح (الكائنات المؤقتة محلية على مستوى الجلسة).POPULATE,REFRESH,TO [db.table], المحركات الداخلية، وجميع البنود الخاصة بـ MV → لا تنطبق على العروض المؤقتة.
ملاحظات حول الاستعلامات الموزعة
Memory)، فيمكن إرسال بياناتها إلى الخوادم البعيدة أثناء تنفيذ الاستعلامات الموزعة، تمامًا كما هو الحال مع الجداول المؤقتة.