SELECT وINSERT على البيانات المخزنة على خادم PostgreSQL بعيد.
حاليًا، لا يدعم محرك الجدول PostgreSQL هذا إلا PostgreSQL بالإصدار 12 فما فوق.
إنشاء جدول
- يجب أن تكون أسماء الأعمدة مطابقة لما هي عليه في جدول PostgreSQL الأصلي، ولكن يمكنك استخدام بعض هذه الأعمدة فقط وبأي ترتيب.
- قد تختلف أنواع الأعمدة عن تلك الموجودة في جدول PostgreSQL الأصلي. يحاول ClickHouse cast القيم إلى أنواع بيانات ClickHouse.
- يحدّد الإعداد external_table_functions_use_nulls كيفية التعامل مع الأعمدة Nullable. القيمة الافتراضية: 1. إذا كانت القيمة 0، فلن تُنشئ دالة الجدول أعمدة Nullable، وستُدرج القيم الافتراضية بدلًا من قيم NULL. وينطبق هذا أيضًا على قيم NULL داخل المصفوفات.
host:port— عنوان خادم PostgreSQL.database— اسم قاعدة البيانات البعيدة.table— اسم الجدول البعيد، أو استعلام يُمرَّر إلى PostgreSQL كما هو (راجع تمرير استعلام بدلًا من اسم جدول).user— مستخدم PostgreSQL.password— كلمة مرور المستخدم.schema— مخطط الجدول غير الافتراضي. اختياري.on_conflict— استراتيجية حل التعارض. مثال:ON CONFLICT DO NOTHING. اختياري. ملاحظة: ستؤدي إضافة هذا الخيار إلى جعل الإدراج أقل كفاءة.
TLS/SSL
تُمرَّر معلمات TLS/SSL إلىlibpq، ويمكن ضبطها كمفاتيح في مجموعة مُسمّاة أو كوسيطات مفتاح-قيمة لاحقة: sslmode (disable أو allow أو prefer أو require أو verify-ca أو verify-full)، بالإضافة إلى الشهادات والمفتاح، بإحدى صيغتين. عند عدم تعيينها، تُستخدم القيم الافتراضية لـ libpq (sslmode=prefer).
sslrootcert(شهادة CA، أو القيمة الخاصةsystem) وsslcert(شهادة العميل) وsslkey(المفتاح الخاص للعميل) هي مسارات لملفات محلية على الخادم. لا يمكن تحديدها إلا ضمن مجموعة مُسمّاة معرّفة في ملف تهيئة الخادم، ولا يمكن تجاوزها في استعلام، إذ يفتح الخادم الملفات بصلاحياته الخاصة.- تقبل
sslrootcert_pemوsslcert_pemوsslkey_pemالمحتوى الحرفي للملف المقابل بدلاً من مساره. ويمكن تحديدها في أي مكان — في استعلام، أو في مجموعة مُسمّاة أُنشئت باستخدام SQL، أو كتجاوز لمجموعة مُسمّاة — وتُحجب في السجلات واستعلاماتSHOWكما تُحجب كلمة المرور.
الإعدادات
يمكن تهيئة مجمّع الاتصالات الذي يستخدمه محرك الجدولPostgreSQL (ودالة الجدول postgresql) لكل جدول على حدة باستخدام عبارة SETTINGS. وعند عدم تحديد إعداد معيّن، تُستخدم تلقائيًا قيمة إعداد postgresql_* المقابل على مستوى الاستعلام.
postgresql_connection_pool_size
حجم مجمّع الاتصالات (إذا كانت جميع الاتصالات قيد الاستخدام، ينتظر الاستعلام حتى يصبح أحد الاتصالات متاحًا). يجب أن تكون القيمة غير صفرية.
القيمة الافتراضية: 16.
postgresql_connection_pool_wait_timeout
مهلة انتظار push/pop لمجمع الاتصالات، بالمللي ثانية، عندما يكون المجمع فارغًا. تعني القيمة 0 أنه يتم الحظر عند فراغ المجمع.
القيمة الافتراضية: 5000.
postgresql_connection_pool_retries
عدد مرات إعادة المحاولة لعمليتَي push/pop في مجمع الاتصالات.
القيمة الافتراضية: 2.
postgresql_connection_pool_auto_close_connection
أغلق الاتصال قبل إعادته إلى مجمّع الاتصالات.
القيمة الافتراضية: false.
postgresql_connection_attempt_timeout
مهلة الاتصال، بالثواني، لمحاولة واحدة للاتصال بنقطة نهاية PostgreSQL. تُمرَّر القيمة كمعلمة connect_timeout في عنوان URL الخاص بالاتصال.
القيمة الافتراضية: 2.
مثال:
تفاصيل التنفيذ
تُنفَّذ استعلاماتSELECT على جانب PostgreSQL بصيغة COPY (SELECT ...) TO STDOUT داخل معاملة PostgreSQL للقراءة فقط، مع تنفيذ commit بعد كل استعلام SELECT.
تُنفَّذ عبارات WHERE البسيطة مثل =, !=, >, >=, <, <=, وIN على خادم PostgreSQL.
تُنفَّذ جميع عمليات JOIN، وعمليات التجميع، والفرز، وشروط IN [ array ]، وقيد أخذ العينات الخاص بـ LIMIT في ClickHouse فقط بعد اكتمال الاستعلام إلى PostgreSQL.
تمرير استعلام بدلًا من اسم جدول
بدلًا من اسم جدول، يمكن أن تكون الوسيطةtable استعلام SELECT يُمرَّر إلى PostgreSQL كما هو. ويُستدل على بنية الجدول من نتيجة الاستعلام. ويمكن كتابة الاستعلام إما كاستعلام فرعي، أو تغليفه داخل الدالة query:
JOIN وعمليات التجميع أو أي معالجة أخرى إلى PostgreSQL. هذا الجدول للقراءة فقط: لا يُسمح بتنفيذ INSERT فيه. وتدعم دالة الجدول postgresql الصياغة نفسها.
تُحلَّل صيغة الاستعلام الفرعي
(SELECT ...) بواسطة ClickHouse، ثم يُعاد تسلسلها وفق لهجة PostgreSQL (وضع علامات الاقتباس لمعرّفات PostgreSQL وإفلات القيم الحرفية النصية) قبل إرسالها إلى الخادم. لذلك يجب أن تكون صالحة في ClickHouse SQL. ولتمرير صياغة خاصة بـ PostgreSQL لا يحللها ClickHouse، استخدم صيغة query('...')، حيث يُرسل نصها إلى PostgreSQL كما هو.لا يتم دفع أي WHERE أو LIMIT خارجي أو تجميع أو غير ذلك من استعلام ClickHouse المحيط إلى الاستعلام المُمرَّر — بل يُطبَّق ذلك في ClickHouse بعد جلب نتيجة الاستعلام كاملةً. ولتقييد البيانات المقروءة من PostgreSQL، ضع عامل تصفية داخل الاستعلام المُمرَّر. عند استخدام external_table_strict_query = 1، يُرفَض عامل تصفية خارجي على أعمدة الجدول مع Exception بدلًا من تطبيقه محليًا، لأنه لا يمكن دفعه إلى الاستعلام المُمرَّر. يغطي التحقق مسند WHERE ذي المستوى الأعلى وكل اقتران في AND ذي المستوى الأعلى. لا تُعد PREWHERE على أعمدة هذا الجدول حالةً لهذا الإعداد: إذ لا يدعم محرك الجدول هذا PREWHERE، ويُرفَض مثل هذا الاستعلام باستخدام ILLEGAL_PREWHERE بغض النظر عن الإعداد. لا يُجرى التحقق إلا حيث يمكن دفع عامل تصفية من الأساس: عندما يكون هذا الجدول هو الجدول الوحيد في الاستعلام، أو على أي من جانبي INNER JOIN، أو على الجانب الحافظ في عملية ربط خارجية (الجانب الأيسر من LEFT JOIN، والجانب الأيمن من RIGHT JOIN). لا يُدفع أي شيء ولا يُتحقق من أي شيء على الجانب غير الحافظ من LEFT/RIGHT JOIN أو على أي من جانبي FULL JOIN، لذا يُطبَّق عامل تصفية على أعمدة هذا الجدول محليًا بعد عملية الربط حتى في الوضع الصارم. حيث يُجرى التحقق، لا يُدفع المسند الذي يشير إلى جداول أخرى مرتبطة في الاستعلام المحيط ويُستثنى من التحقق، سواء أكان يشير إلى الجانب المرتبط فقط أم يخلطه مع هذا الجدول داخل تعبير واحد غير AND (مثلًا OR)؛ يحتفظ مثل هذا المسند بنقطة تقييمه المعتادة في ClickHouse (WHERE بعد عملية الربط، وPREWHERE قبلها) ولا يُرفَض.INSERT على جانب PostgreSQL بصيغة COPY "table_name" (field1, field2, ... fieldN) FROM STDIN داخل معاملة PostgreSQL مع auto-commit بعد كل عبارة INSERT.
تُحوَّل أنواع Array في PostgreSQL إلى مصفوفات في ClickHouse.
انتبه: في PostgreSQL، قد تحتوي بيانات المصفوفة المُنشأة على هيئة
type_name[] على مصفوفات متعددة الأبعاد بأعداد مختلفة من الأبعاد في صفوف مختلفة من الجدول داخل العمود نفسه. لكن في ClickHouse، لا يُسمح إلا بمصفوفات متعددة الأبعاد لها العدد نفسه من الأبعاد في جميع صفوف الجدول داخل العمود نفسه.|. على سبيل المثال:
map، انخفضت الأولوية. أعلى أولوية هي 0.
في المثال أدناه، تتمتع النسخة المتماثلة example01-1 بأعلى أولوية: