يحدّد بند FROM المصدر الذي تُقرأ منه البيانات:
يمكن أيضًا استخدام البندين JOIN وARRAY JOIN لتوسيع إمكانات بند FROM.
الاستعلام الفرعي هو استعلام SELECT آخر يمكن وضعه بين قوسين داخل بند FROM.
يمكن أيضًا استخدام بند VALUES القياسي في SQL كتعبير جدولي:
SELECT * FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c')) AS t(id, val);
راجع دالة الجدول Values لمزيد من التفاصيل.
يمكن أن يحتوي FROM على عدة مصادر بيانات مفصولة بفواصل، وهو ما يعادل إجراء CROSS JOIN عليها.
يمكن أن يَرِد FROM اختياريًا قبل عبارة SELECT. وهذا امتداد خاص بـ ClickHouse لـ SQL القياسي، مما يجعل عبارات SELECT أسهل قراءةً. مثال:
عند تحديد FINAL، يدمج ClickHouse البيانات دمجًا كاملًا قبل إرجاع النتيجة. ويؤدي ذلك أيضًا إلى تنفيذ جميع تحويلات البيانات التي تحدث أثناء عمليات الدمج في محرك الجدول المعني.
ينطبق هذا عند تحديد البيانات من الجداول التي تستخدم محركات الجداول التالية:
ReplacingMergeTree
SummingMergeTree
AggregatingMergeTree
CollapsingMergeTree
VersionedCollapsingMergeTree
تُنفَّذ استعلامات SELECT التي تتضمن FINAL بالتوازي. ويحدّد الإعداد max_final_threads عدد سلاسل التنفيذ المستخدمة.
تُنفَّذ الاستعلامات التي تستخدم FINAL بشكل أبطأ قليلًا من الاستعلامات المماثلة التي لا تستخدم FINAL للأسباب التالية:
- تُدمَج البيانات أثناء تنفيذ الاستعلام.
- قد تقرأ الاستعلامات التي تتضمن
FINAL أعمدة المفتاح الأساسي بالإضافة إلى الأعمدة المحددة في الاستعلام.
يتطلب FINAL موارد إضافية من الحوسبة والذاكرة، لأن المعالجة التي تحدث عادةً في وقت الدمج يجب أن تتم في الذاكرة عند تنفيذ الاستعلام. ومع ذلك، يكون استخدام FINAL ضروريًا أحيانًا للحصول على نتائج دقيقة (إذ قد لا تكون البيانات قد دُمجت بالكامل بعد). كما أن تكلفته أقل من تشغيل OPTIMIZE لفرض عملية دمج.
وكبديل لاستخدام FINAL، يمكن أحيانًا استخدام استعلامات مختلفة تفترض أن العمليات الخلفية لمحرك MergeTree لم تكتمل بعد، وتتعامل مع ذلك عبر تطبيق التجميع (على سبيل المثال، للتخلص من التكرارات). وإذا كنت بحاجة إلى استخدام FINAL في استعلاماتك للحصول على النتائج المطلوبة، فلا بأس بذلك، ولكن ينبغي الانتباه إلى المعالجة الإضافية التي يتطلبها.
يمكن تطبيق FINAL تلقائيًا باستخدام إعداد FINAL على جميع الجداول في الاستعلام باستخدام جلسة أو ملف تعريف مستخدم.
استخدام الكلمة المفتاحية FINAL
SELECT x, y FROM mytable FINAL WHERE x > 1;
استخدام FINAL كإعداد على مستوى الاستعلام
SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;
استخدام FINAL كإعداد على مستوى الجلسة
SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;
عندما يكون للجدول اسم مستعار، يأتي FINAL بعد الاسم المستعار. ويظهر ذلك بوضوح أكبر في استعلامات JOIN، حيث تُستخدم عادةً أسماء مستعارة للجداول:
SELECT t1.id, t2.name
FROM table1 AS t1 FINAL
INNER JOIN table2 AS t2 FINAL ON t1.id = t2.id;
يُعد FINAL مُعدِّلًا على مرجع الجدول، لذا يجب أن يأتي بعد الصيغة الكاملة table [AS alias]. ووضعه قبل الاسم المستعار (FROM table1 FINAL AS t1) يُعد خطأً نحويًا.
إذا حُذف بند FROM، فستُقرأ البيانات من جدول system.one.
يحتوي جدول system.one على صف واحد فقط (ويؤدي هذا الجدول الغرض نفسه الذي يؤديه جدول DUAL في أنظمة إدارة قواعد البيانات الأخرى).
لتنفيذ استعلام، تُستخرج جميع الأعمدة المذكورة في الاستعلام من الجدول المناسب. وتُستبعَد من الاستعلامات الفرعية أي أعمدة لا يلزمها الاستعلام الخارجي.
إذا لم يذكر الاستعلام أي أعمدة (على سبيل المثال، SELECT count() FROM t)، فسيُستخرج أحد الأعمدة من الجدول على أي حال (مع تفضيل أصغرها)، وذلك لحساب عدد الصفوف. آخر تعديل في ٢٩ يونيو ٢٠٢٦