(c1, c2, c3). يمكنك أيضًا استخدام تعبير مع مُطابِق الأعمدة مثل * و/أو مُعدِّلات مثل APPLY وEXCEPT وREPLACE.
على سبيل المثال، لننظر إلى الجدول التالي:
b، يمكنك القيام بذلك باستخدام الكلمة المفتاحية EXCEPT. وبالاستناد إلى الصياغة أعلاه، ستحتاج إلى التأكد من إدراج عدد من القيم (VALUES (v11, v13)) يساوي عدد الأعمدة التي تحددها ((c1, c3)) :
a وc من القيم المُمرَّرة، بينما مُلِئ العمود b بالقيمة الافتراضية. كما يمكن أيضًا استخدام الكلمة المفتاحية DEFAULT لإدراج قيم افتراضية:
- القيم المحسوبة من تعبيرات
DEFAULTالمحددة في تعريف الجدول. - الأصفار والسلاسل النصية الفارغة إذا لم تكن تعبيرات
DEFAULTمعرّفة.
INSERT ... VALUES:
إذا أردت تحديد
SETTINGS لاستعلام INSERT، فعليك فعل ذلك قبل عبارة FORMAT لأن كل ما يأتي بعد FORMAT format_name يُعامل على أنه بيانات. على سبيل المثال:القيود
إذا كان للجدول قيود، فسيتم التحقق من تعبيراتها لكل صف من البيانات المُدخلة. وإذا لم يُستوفَ أيٌّ من هذه القيود، فسيُصدر الخادم استثناءً يتضمن اسم القيد وتعبيره، وسيتوقف الاستعلام.التحقق من صحة أنواع البيانات
يتحقق ClickHouse من أنواع البيانات المسموح بها (التي تتحكم فيها إعدادات مثلenable_time_time64_type وallow_suspicious_low_cardinality_types وallow_suspicious_fixed_string_types وغيرها) فقط عند إنشاء الجدول (CREATE TABLE) وتعديل المخطط (ALTER TABLE)، وليس أثناء INSERT.
وهذا يعني أنه إذا كان هناك جدول أُنشئ مسبقًا ويحتوي على نوع بيانات غير مسموح به، فلا يزال بالإمكان إدراج البيانات فيه حتى إذا كان الإعداد المقابل معطّلًا على الخادم. وهذا سلوك مقصود — فبعد إنشاء الجدول، يجب ألا تُمنع عمليات الإدراج بسبب إعدادات تتحكم في إنشاء الأنواع.
على سبيل المثال:
ونتيجة لذلك، يمكن لعميل يعمل بإصدار أحدث (حيث يكون أحد الإعدادات مفعّلًا افتراضيًا) أن يُدرج بيانات ذات أنواع بيانات غير مسموح بها في خادم يعمل بإصدار أقدم (حيث يكون هذا الإعداد معطّلًا)، ما دام الجدول الهدف يحتوي بالفعل على أنواع الأعمدة المقابلة. ويُطبَّق هذا التحقق على مستوى DDL، وليس على مستوى DML.
إدراج نتائج SELECT
البنيةSELECT. ومع ذلك، قد تختلف أسماؤها بين تعبير SELECT والجدول المُستخدَم في INSERT. وإذا لزم الأمر، يُجرى تحويل النوع.
لا يسمح أيٌّ من تنسيقات البيانات، باستثناء تنسيق Values، باستخدام تعبيرات كقيم مثل now() و1 + 2 وما إلى ذلك. ويتيح تنسيق Values استخدامًا محدودًا للتعبيرات، لكن لا يُنصح بذلك، لأن تنفيذها في هذه الحالة يعتمد على كود غير فعّال.
الاستعلامات الأخرى التي تعدّل أجزاء البيانات غير مدعومة: UPDATE وDELETE وREPLACE وMERGE وUPSERT وINSERT UPDATE.
ومع ذلك، يمكنك حذف البيانات القديمة باستخدام ALTER TABLE ... DROP PARTITION.
يجب تحديد عبارة FORMAT في نهاية الاستعلام إذا كانت عبارة SELECT تتضمن دالة الجدول input().
لإدراج قيمة افتراضية بدلًا من NULL في عمود ذي نوع بيانات غير قابل لـ NULL، فعِّل الإعداد insert_null_as_default.
يدعم INSERT أيضًا CTE (تعبير الجدول الشائع). على سبيل المثال، العبارتان التاليتان متكافئتان:
إدراج البيانات من ملف
الصيغةfile_name وtype هما قيمتان حرفيتان نصّيتان. يجب تحديد تنسيق لملف الإدخال في عبارة FORMAT.
الملفات المضغوطة مدعومة. يُكتشف نوع الضغط من امتداد اسم الملف، أو يمكن تحديده صراحةً في عبارة COMPRESSION. الأنواع المدعومة هي: 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2', 'snappy'. بالنسبة إلى snappy، يُحدَّد تنسيق النقل عبر إعداد snappy_mode (basic افتراضيًا).
تتوفر هذه الإمكانية في عميل سطر الأوامر وclickhouse-local.
أمثلة
ملف واحد باستخدام FROM INFILE
نفّذ الاستعلامات التالية باستخدام عميل سطر الأوامر:Query
Response
ملفات متعددة مع FROM INFILE باستخدام أنماط glob
هذا المثال مشابه جدًا للمثال السابق، لكن عمليات الإدراج تُجرى من عدة ملفات باستخدامFROM INFILE 'input_*.csv.
الإدراج باستخدام دالة جدول
يمكن إدراج البيانات في الجداول التي تشير إليها دوال الجداول. الصيغةQuery
Response
الإدراج في ClickHouse Cloud
بشكل افتراضي، توفّر الخدمات على ClickHouse Cloud عدة نُسخ متماثلة لضمان الإتاحة العالية. وعند الاتصال بخدمة، يُنشأ الاتصال بإحدى هذه النُسخ المتماثلة. بعد نجاح عمليةINSERT، تُكتَب البيانات إلى التخزين الأساسي. ومع ذلك، قد يستغرق وصول هذه التحديثات إلى النُسخ المتماثلة بعض الوقت. لذلك، إذا استخدمت اتصالًا مختلفًا ينفّذ استعلام SELECT على إحدى هذه النُسخ المتماثلة الأخرى، فقد لا تظهر البيانات المحدَّثة بعد.
يمكن استخدام select_sequential_consistency لإجبار النسخة المتماثلة على تلقّي أحدث التحديثات. في ما يلي مثال على استعلام SELECT يستخدم هذا الإعداد:
select_sequential_consistency يزيد العبء على ClickHouse Keeper (الذي يستخدمه ClickHouse Cloud داخليًا)، وقد يؤدي إلى تباطؤ الأداء تبعًا لمقدار الحمل على الخدمة. لا نوصي بتمكين هذا الإعداد إلا عند الضرورة. والنهج الموصى به هو تنفيذ عمليات القراءة والكتابة ضمن الجلسة نفسها، أو استخدام برنامج تشغيل عميل يعتمد البروتوكول الأصلي (وبذلك يدعم الاتصالات المثبّتة).
الإدراج في إعداد يعتمد النسخ المتماثل
في إعداد يعتمد النسخ المتماثل، تصبح البيانات مرئية على النسخ المتماثلة الأخرى بعد اكتمال نسخها متماثلًا. تبدأ عملية نسخ البيانات (وتنزيلها إلى النسخ المتماثلة الأخرى) مباشرةً بعد تنفيذINSERT. ويختلف هذا عن ClickHouse Cloud، حيث تُكتب البيانات فورًا إلى التخزين المشترك، وتتابع النسخ المتماثلة تغييرات البيانات الوصفية.
لاحظ أنه في الإعدادات التي تعتمد النسخ المتماثل، قد تستغرق عمليات INSERTs أحيانًا وقتًا ملحوظًا (في حدود ثانية واحدة)، لأنها تتطلب تنفيذ commit في ClickHouse Keeper لتحقيق التوافق الموزّع. كما أن استخدام S3 للتخزين يضيف زمن استجابة إضافيًا.
اعتبارات الأداء
يقومINSERT بفرز بيانات الإدخال حسب المفتاح الأساسي وتقسيمها إلى تقسيمات وفقًا لمفتاح التقسيم. إذا أدخلت البيانات في عدة تقسيمات دفعةً واحدة، فقد يؤدي ذلك إلى انخفاض ملحوظ في أداء استعلام INSERT. لتجنب ذلك:
- أضِف البيانات على دفعات كبيرة نسبيًا، مثل 100,000 صف في كل مرة.
- اجمع البيانات حسب مفتاح التقسيم قبل تحميلها إلى ClickHouse.
- أُضيفت البيانات في الوقت الفعلي.
- حمّلت بيانات تكون عادةً مرتبة حسب الوقت.
الإدراجات غير المتزامنة
يمكن إدراج البيانات بشكل غير متزامن عبر عمليات إدراج صغيرة الحجم ولكن متكررة. تُدمَج بيانات عمليات الإدراج هذه في دفعات، ثم تُدرَج بأمان في جدول. لاستخدام الإدراجات غير المتزامنة، فعِّل إعدادasync_insert.
يؤدي استخدام async_insert أو محرك الجداول Buffer إلى إضافة تخزين مؤقت.
عمليات الإدراج الكبيرة أو طويلة التشغيل
عند إدراج كميات كبيرة من البيانات، يعمل ClickHouse على تحسين أداء الكتابة من خلال عملية تُسمّى “squashing”. تُدمَج كتل البيانات الصغيرة المُدرجة في الذاكرة وتُجمع في كتل أكبر قبل كتابتها إلى القرص. تقلّل عملية squashing الأعباء الإضافية المرتبطة بكل عملية كتابة. أثناء هذه العملية، تصبح البيانات المُدرجة متاحة للاستعلام بعد أن يُكمل ClickHouse كتابة كلmax_insert_block_size صف.
انظر أيضًا
- async_insert
- wait_for_async_insert
- wait_for_async_insert_timeout
- async_insert_max_data_size
- async_insert_busy_timeout_ms
async_insert_stale_timeout_ms