Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

محرك الجدول Merge

المحرك Merge (عدم الخلط بينه وبين MergeTree) لا يخزّن البيانات بنفسه، بل يتيح القراءة من أي عدد من الجداول الأخرى في الوقت نفسه.

تُنفَّذ القراءة بالتوازي تلقائيًا. ولا يدعم الكتابة إلى جدول. وعند القراءة، تُستخدم فهارس الجداول التي تُقرأ فعليًا، إن وُجدت.

إنشاء جدول

CREATE TABLE ... Engine=Merge(db_name, tables_regexp)

معلمات المحرك

db_name

db_name — القيم الممكنة:

  • اسم قاعدة البيانات،
    • تعبير ثابت يُرجع سلسلة نصية تحتوي على اسم قاعدة بيانات، على سبيل المثال، currentDatabase(),
    • REGEXP(expression)، حيث يكون expression تعبيرًا نمطيًا لمطابقة أسماء قواعد البيانات.

tables_regexp

tables_regexp — تعبير نمطي لمطابقة أسماء الجداول في DB أو DBs المحدَّدين.

التعبيرات النمطية — re2 (يدعم مجموعة فرعية من PCRE)، وهو حساس لحالة الأحرف. راجع الملاحظات حول إفلات الرموز في التعبيرات النمطية في قسم "match".

الاستخدام

عند تحديد الجداول المطلوب القراءة منها، لا يُختار جدول Merge نفسه، حتى لو كان يطابق التعبير النمطي. وذلك لتجنّب الحلقات. يمكن إنشاء جدولَي Merge يحاول كلٌّ منهما قراءة بيانات الآخر بلا نهاية، لكن هذه ليست فكرة جيدة.

الطريقة المعتادة لاستخدام محرّك Merge هي التعامل مع عدد كبير من جداول TinyLog كما لو كانت جدولًا واحدًا.

أمثلة

مثال 1

لنفترض وجود قاعدتي البيانات ABC_corporate_site وABC_store. سيحتوي جدول all_visitors على معرّفات من الجدولين visitors في كلتا قاعدتي البيانات.

CREATE TABLE all_visitors (id UInt32) ENGINE=Merge(REGEXP('ABC_*'), 'visitors');

مثال 2

لنفترض أن لديك جدولًا قديمًا باسم WatchLog_old وقررت تغيير التقسيم دون نقل البيانات إلى جدول جديد باسم WatchLog_new، وتحتاج إلى عرض البيانات من كلا الجدولين.

CREATE TABLE WatchLog_old(
    date Date,
    UserId Int64,
    EventType String,
    Cnt UInt64
)
ENGINE=MergeTree
ORDER BY (date, UserId, EventType);

INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3);

CREATE TABLE WatchLog_new(
    date Date,
    UserId Int64,
    EventType String,
    Cnt UInt64
)
ENGINE=MergeTree
PARTITION BY date
ORDER BY (UserId, EventType)
SETTINGS index_granularity=8192;

INSERT INTO WatchLog_new VALUES ('2018-01-02', 2, 'hit', 3);

CREATE TABLE WatchLog AS WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog');

SELECT * FROM WatchLog;
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-01 │      1 │ hit       │   3 │
└────────────┴────────┴───────────┴─────┘
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-02 │      2 │ hit       │   3 │
└────────────┴────────┴───────────┴─────┘

الأعمدة الافتراضية

  • _table — اسم الجدول الذي قُرئت منه البيانات. النوع: String.

    إذا قمت بالتصفية باستخدام _table، (على سبيل المثال WHERE _table='xyz') فلن تُقرأ إلا الجداول التي تستوفي شرط التصفية.

  • _database — يتضمن اسم قاعدة البيانات التي قُرئت منها البيانات. النوع: String.

انظر أيضًا

Navigation