> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> تعريفات لمفاهيم قواعد البيانات ومصطلحات ClickHouse، مع التركيز على السلوكيات التي تختلف عن قواعد البيانات المعاملاتية.

# مسرد المصطلحات

export const Glossary = ({children, metadata = {}}) => {
  const nodeText = node => {
    if (node === null || node === undefined || typeof node === "boolean") return "";
    if (typeof node === "string" || typeof node === "number") return String(node);
    if (Array.isArray(node)) return node.map(nodeText).join(" ");
    return nodeText(node.props && node.props.children);
  };
  const entries = [];
  const childNodes = Array.isArray(children) ? children : [children];
  let currentEntry;
  childNodes.forEach(node => {
    const id = node && node.props && node.props.id;
    if (id) {
      currentEntry = {
        id,
        term: nodeText(node),
        content: [],
        ...metadata[id] || ({})
      };
      entries.push(currentEntry);
    } else if (currentEntry && node !== null && node !== undefined) {
      currentEntry.content.push(node);
    }
  });
  const [query, setQuery] = useState("");
  const searchForms = value => {
    const text = String(value);
    const lowercase = text.toLowerCase();
    const words = text.replace(/([a-z0-9])([A-Z])/g, "$1 $2").toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
    return [...new Set([lowercase, words])];
  };
  const queryForms = searchForms(query.trim()).filter(Boolean);
  const matches = (value, exact = false) => searchForms(value).some(valueForm => queryForms.some(queryForm => exact ? valueForm === queryForm : valueForm.includes(queryForm)));
  const matchRank = entry => {
    if (matches(entry.term, true)) return 2;
    if ((entry.aliases || []).some(value => matches(value, true))) return 1;
    return 0;
  };
  const visibleEntries = queryForms.length > 0 ? entries.filter(entry => [entry.term, ...entry.aliases || [], nodeText(entry.content)].some(value => matches(value))).sort((a, b) => matchRank(b) - matchRank(a)) : entries;
  return <div className="not-prose glossary-browser">
      <div className="glossary-search-row">
        <label className="sr-only" htmlFor="glossary-search">
          البحث في مصطلحات المسرد وتعريفاتها
        </label>
        <div className="glossary-search-wrap">
          <svg aria-hidden="true" viewBox="0 0 20 20" className="glossary-search-icon">
            <path d="m17 17-3.7-3.7m1.7-4.8A6.5 6.5 0 1 1 2 8.5a6.5 6.5 0 0 1 13 0Z" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
          </svg>
          <input id="glossary-search" type="search" value={query} onChange={event => setQuery(event.target.value)} placeholder="ابحث في المصطلحات والتعريفات..." autoComplete="off" />
        </div>
        <span className="glossary-count" aria-live="polite">
          {visibleEntries.length} {visibleEntries.length === 1 ? "مصطلح" : "مصطلحات"}
        </span>
      </div>

      {visibleEntries.length > 0 ? <div className="glossary-grid">
          {visibleEntries.map(entry => <article key={entry.id} className="glossary-entry">
              <h2 id={entry.id} className="glossary-entry-title">
                {entry.code ? <code>{entry.term}</code> : entry.term}
              </h2>
              {(entry.legacyIds || []).map(id => <span key={id} id={id} className="glossary-entry-legacy-anchor" aria-hidden="true" />)}
              <div className="glossary-entry-description">{entry.content}</div>
              {entry.learnMore && <a className="glossary-entry-link" href={entry.learnMore}>
                  معرفة المزيد <span aria-hidden="true">→</span>
                </a>}
            </article>)}
        </div> : <div className="glossary-empty">
          <p>لا توجد مصطلحات في المسرد تطابق «{query}».</p>
          <button type="button" onClick={() => setQuery("")}>
            مسح البحث
          </button>
        </div>}

      <style>{`
        .glossary-browser { margin-top: 1.5rem; }
        .glossary-search-row { display: flex; align-items: center; gap: .75rem; margin-bottom: 1.25rem; }
        .glossary-search-wrap { position: relative; flex: 1; }
        .glossary-search-icon { position: absolute; top: 50%; left: .85rem; width: 1rem; height: 1rem; color: #6b7280; transform: translateY(-50%); pointer-events: none; }
        .glossary-search-wrap input { width: 100%; height: 2.75rem; padding: 0 1rem 0 2.5rem; color: inherit; background: var(--background-light, #fff); border: 1px solid rgb(156 163 175 / .35); border-radius: .5rem; outline: none; }
        .glossary-search-wrap input:focus { border-color: #f1c40f; box-shadow: 0 0 0 3px rgb(253 255 117 / .35); }
        .dark .glossary-search-wrap input { background: var(--background-dark, #151515); border-color: rgb(107 114 128 / .45); }
        .glossary-count { flex: none; min-width: 4.5rem; color: #6b7280; font-size: .8rem; text-align: right; }
        .dark .glossary-count { color: #9ca3af; }
        .glossary-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: .85rem; }
        .glossary-entry { position: relative; padding: 1.15rem 1.25rem; background: var(--background-light, #fff); border: 1px solid rgb(156 163 175 / .3); border-radius: .65rem; }
        .dark .glossary-entry { background: var(--background-dark, #151515); border-color: rgb(107 114 128 / .35); }
        .glossary-entry-title { margin: 0 0 .55rem; scroll-margin-top: 6rem; font-size: 1.05rem; line-height: 1.35; }
        .glossary-entry-legacy-anchor { position: absolute; top: 0; scroll-margin-top: 6rem; }
        .glossary-entry-title code { font-size: .95em; }
        .glossary-entry-description { color: #4b5563; font-size: .9rem; line-height: 1.55; }
        .dark .glossary-entry-description { color: #d1d5db; }
        .glossary-entry-description p { margin: 0; }
        .glossary-entry-link { display: inline-block; margin-top: .75rem; color: inherit; font-size: .85rem; font-weight: 600; text-decoration: none; }
        .glossary-entry-link:hover { text-decoration: underline; }
        .glossary-empty { padding: 2.5rem 1rem; text-align: center; border: 1px dashed rgb(156 163 175 / .45); border-radius: .65rem; }
        .glossary-empty p { margin: 0 0 .75rem; color: #6b7280; }
        .glossary-empty button { padding: .45rem .75rem; color: inherit; background: transparent; border: 1px solid rgb(156 163 175 / .45); border-radius: .4rem; cursor: pointer; }
        @media (min-width: 768px) {
          .glossary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
        }
        @media (max-width: 520px) {
          .glossary-search-row { align-items: stretch; flex-direction: column; }
          .glossary-count { min-width: 0; text-align: left; }
        }
      `}</style>
    </div>;
};

مسرد لمفاهيم قواعد البيانات ومصطلحات ClickHouse، يوضح كيف تختلف مصطلحات قواعد البيانات المألوفة في ClickHouse.

export const glossaryMetadata = {
  delete: {
    learnMore: '/deletes/overview'
  },
  deduplication: {
    aliases: ['صفوف مكررة', 'قيد فريد'],
    learnMore: '/guides/developer/deduplication'
  },
  dictionary: {
    learnMore: '/dictionary'
  },
  'distributed-table': {
    learnMore: '/engines/table-engines/special/distributed'
  },
  final: {
    aliases: ['ما زالت التكرارات تظهر', 'دمج وقت الاستعلام'],
    code: true,
    learnMore: '/sql-reference/statements/select/from#final-modifier'
  },
  granule: {
    learnMore: '/guides/clickhouse/data-modelling/sparse-primary-indexes#clickhouse-index-design'
  },
  'incremental-materialized-view': {
    aliases: ['مشغّل الإدراج'],
    learnMore: '/materialized-view/incremental-materialized-view'
  },
  json: {
    code: true,
    learnMore: '/sql-reference/data-types/newjson'
  },
  'materialized-view': {
    aliases: ['MV', 'استعلام مخزّن', 'مشغّل الإدراج', 'جدول ديناميكي', 'جداول ديناميكية'],
    learnMore: '/materialized-views'
  },
  merge: {
    learnMore: '/merges'
  },
  mergetree: {
    code: true,
    learnMore: '/engines/table-engines/mergetree-family/mergetree'
  },
  mutation: {
    aliases: ['ALTER UPDATE', 'ALTER DELETE', 'تعليمة MERGE'],
    learnMore: '/concepts/best-practices/avoid-mutations'
  },
  'nullable-column': {
    aliases: ['NULL', 'NULL مقابل القيمة الافتراضية'],
    learnMore: '/sql-reference/data-types/nullable'
  },
  parts: {
    learnMore: '/concepts/core-concepts/parts'
  },
  partition: {
    aliases: ['PARTITION BY', 'استبعاد الأقسام'],
    learnMore: '/partitions'
  },
  'partitioning-key': {
    learnMore: '/concepts/core-concepts/partitions'
  },
  'primary-key': {
    aliases: ['ORDER BY', 'مفتاح الفرز', 'مفتاح فريد', 'قيد فريد'],
    learnMore: '/concepts/core-concepts/primary-indexes'
  },
  projection: {
    aliases: ['الإسقاط مقابل العرض المادي', 'ترتيب بديل'],
    learnMore: '/data-modeling/projections'
  },
  'refreshable-materialized-view': {
    aliases: ['عرض مادي مجدول', 'تحديث العرض المادي', 'استعلام مجدول', 'استعلامات مجدولة'],
    learnMore: '/materialized-view/refreshable-materialized-view'
  },
  replacingmergetree: {
    aliases: ['إدراج أو تحديث', 'إزالة التكرار', 'لا تزال التكرارات موجودة', 'تعليمة MERGE'],
    code: true,
    learnMore: '/guides/replacing-merge-tree'
  },
  'secondary-index': {
    learnMore: '/optimize/skipping-indexes'
  },
  'skipping-index': {
    learnMore: '/optimize/skipping-indexes'
  },
  'sorting-key': {
    aliases: ['ORDER BY', 'مفتاح أساسي', 'ترتيب على القرص', 'مفتاح التجميع العنقودي', 'أعمدة التجميع العنقودي', 'جدول مجمّع عنقوديًا', 'CLUSTER BY'],
    learnMore: '/concepts/best-practices/choosing-a-primary-key'
  },
  'sparse-index': {
    learnMore: '/guides/clickhouse/data-modelling/sparse-primary-indexes'
  },
  'table-engine': {
    learnMore: '/engines/table-engines'
  },
  transaction: {
    learnMore: '/guides/developer/transactional'
  },
  ttl: {
    aliases: ['انتهاء الصلاحية', 'الاحتفاظ', 'الاحتفاظ بالبيانات'],
    code: true,
    learnMore: '/concepts/features/operations/delete/ttl'
  },
  update: {
    aliases: ['تحديث صف', 'تحديث خفيف الوزن'],
    legacyIds: ['lightweight-update'],
    learnMore: '/updating-data/overview'
  },
  upsert: {
    aliases: ['ON CONFLICT', 'إدراج أو تحديث', 'تعليمة MERGE'],
    learnMore: '/guides/replacing-merge-tree'
  },
  warehouse: {
    aliases: ['فصل الحوسبة عن الحوسبة', 'مستودع افتراضي', 'مستودعات افتراضية'],
    learnMore: '/cloud/reference/warehouses'
  }
};

<Glossary metadata={glossaryMetadata}>
  ## الذرّية (Atomicity)

  تعني الذرّية أنّ العملية تظهر إمّا بالكامل أو لا تظهر إطلاقًا. في ClickHouse، يكون الإدراج في partition واحدة من جدول ينتمي إلى عائلة `MergeTree` ذرّيًا عندما تُكتب صفوفه ضمن block واحد. أمّا الإدراج الممتدّ عبر عدّة partitions فيكون ذرّيًا على نحو منفصل لكل partition، كما أنّ الإدراج في جدول موزّع يكون ذرّيًا على نحو منفصل لكل shard. ولا تزال المعاملات متعدّدة العبارات تجريبية ومقيّدة.

  ## الكتلة (Block)

  الـ block هو دفعة (batch) عمودية ذاتية الوصف من الصفوف تُستخدم في معالجة الاستعلامات ونقل البيانات. والـ blocks هي وحدات تخص وقت التشغيل (runtime) والنقل عبر الشبكة؛ أما أجزاء البيانات (data parts) والـ granules فهي مفاهيم منفصلة تتعلق بالتخزين والفهرسة. ومعالجة قيم الأعمدة داخل الـ blocks هي ما يتيح التنفيذ المتّجه (vectorized).

  ## الكتلة (Cluster)

  مجموعة من العُقد (الخوادم) التي تعمل معًا لتخزين البيانات ومعالجتها.

  ## مفاتيح التشفير المُدارة من قِبل العميل (CMEK)

  في ClickHouse Cloud، تتيح مفاتيح التشفير التي يديرها العميل (CMEK) استخدام مفتاح خدمة إدارة المفاتيح (KMS) الخاص بالعميل لحماية مفتاح تشفير البيانات (DEK) المستخدم لتشفير البيانات أثناء التخزين.

  ## الحذف

  في جداول عائلة `MergeTree`، قد يعني حذف الصفوف وضع علامة "محذوف" عليها باستخدام `DELETE FROM`، أو إعادة كتابة أجزاء البيانات المتأثرة باستخدام `ALTER TABLE ... DELETE`، أو إزالة قسم كامل بكفاءة. تُخفي عمليات الحذف الخفيفة الصفوف عن الاستعلامات اللاحقة قبل أن تُزال البيانات فعليًا أثناء عمليات الدمج في الخلفية.

  ## إزالة التكرار

  قد يشير إلغاء التكرار إلى آليات مختلفة في ClickHouse. ففي إلغاء تكرار إصدارات الصفوف، تُحدِّد محركات مثل `ReplacingMergeTree` الإصدارات المكررة عبر مفتاح الفرز وتعالجها أثناء عمليات الدمج في الخلفية ضمن الـ partition. أما محركات الجداول المنسوخة (Replicated) فيمكنها، بصورة منفصلة، إلغاء تكرار كتل الإدراج المعاد إرسالها اعتمادًا على معرفات الكتل الخاصة بها.

  ## القاموس (Dictionary)

  يوفّر القاموس (dictionary) وصولاً بنمط المفتاح-القيمة (key-value) إلى البيانات المرجعية من مصدر في الذاكرة (in-memory) أو مصدر خارجي (external). وفي عمليات البحث (lookups) المتوافقة القائمة على المفتاح، تُغني دوال القاموس أو استخدام `JOIN` مباشر (direct) مع القاموس عن الفحص المتكرر لجدول مرجعي.

  ## جدول Distributed

  الجدول الموزّع (distributed table) في ClickHouse هو نوع خاص من الجداول لا يخزّن البيانات بنفسه، وإنما يوفّر عرضًا موحّدًا لمعالجة الاستعلامات الموزّعة عبر عدة خوادم ضمن الـ cluster.

  ## `FINAL`

  `FINAL` هو مُعدِّل استعلام يطبّق تحويلات وقت الدمج الخاصة بالمحرك أثناء قراءة البيانات، دون دمج الأجزاء المخزَّنة فعليًا على القرص. ويمكنه إرجاع نتائج مُوفَّقة من محركات مثل `ReplacingMergeTree` قبل اكتمال عمليات الدمج في الخلفية، وذلك مقابل استهلاك إضافي للحوسبة والذاكرة أثناء تنفيذ الاستعلام.

  ## الحُبيبة (Granule)

  الـ granule هو أصغر مجموعة منطقية من الصفوف يقرأها ClickHouse عند تقليم الفهرس الأساسي (primary index). ويحتوي افتراضيًا على ما يصل إلى 8,192 صفًا، غير أن دقة الفهرس التكيفية (adaptive index granularity) قد تُنتج granules أصغر حجمًا. وعادةً ما يخزّن الفهرس الأساسي مدخلًا واحدًا لكل granule.

  ## العرض المُجسَّد التزايدي

  ينفّذ العرض المادي التزايدي استعلامه أثناء إدراج البيانات في الجدول المصدر، ويكتب النتيجة في الجدول الهدف. وهو يعالج الكتل المُدرجة حديثًا فقط، وليس الحالة الحالية الكاملة للجدول المصدر، كما أن التغييرات التي تطرأ على جداول الجانب الأيمن المضمومة لا تعيد تشغيله.

  ## `JSON`

  يخزّن النوع `JSON` مستندات شبه مهيكلة قد تتباين مساراتها وأنواعها من صف إلى آخر. تخزّن ClickHouse المسارات المكتشفة كأعمدة فرعية، بحيث تستطيع الاستعلامات قراءة كل حقل على حدة بكفاءة. استخدم الأعمدة ذات الأنواع المحددة أو الأنواع الهيكلية مثل `Tuple` عندما يكون المخطط مستقرًا.

  ## ملف العلامات

  يخزّن ملف العلامات (mark file) إزاحات (offsets) تحدد مواضع الحبيبات (granules) ضمن بيانات الأعمدة المضغوطة. وتسجّل كل علامة (mark) إزاحةً داخل الملف المضغوط وإزاحةً داخل الكتلة (block) المفكوكة الضغط المقابلة، مما يتيح لـ ClickHouse الانتقال (seek) مباشرةً إلى حبيبة معينة دون قراءة العمود بأكمله.

  ## العرض المُجسَّد (Materialized view)

  يوفّر ClickHouse نوعين من العروض المادية (materialized views). فالعرض المادي التزايدي (incremental materialized view) يعمل كمُشغّل (trigger) عند الإدراج يعالج الكتل (blocks) المُدرجة حديثًا، بينما يعيد العرض المادي القابل للتحديث (refreshable materialized view) تنفيذ استعلامه دوريًا على مجموعة البيانات كاملةً. وقد تجمع الميزات ذات الأسماء المشابهة في قواعد بيانات أخرى بين هذين السلوكين، ولذلك لا يوجد دائمًا تقابل واحد لواحد بينها.

  ## الدمج (Merge)

  الدمج في ClickHouse هو عملية تخزين تجري في الخلفية وتدمج أجزاء البيانات الصغيرة غير القابلة للتغيير في أجزاء أكبر ضمن الـ PARTITION نفسه. وبحسب محرك الجدول، يمكن لعمليات الدمج أيضًا أن تُجمِّع الصفوف أو تطويها أو تستبدلها؛ وهي تختلف عن جملة SQL المعاملاتية `MERGE`.

  ## `MergeTree`

  إن `MergeTree` في ClickHouse هو محرك جداول مصمّم لمعدلات استيعاب بيانات عالية وأحجام بيانات كبيرة. وهو محرك التخزين الأساسي في ClickHouse، إذ يوفّر ميزات مثل التخزين العمودي، والتقسيم المخصص، والفهارس الأولية المتفرقة، ودعم عمليات دمج البيانات في الخلفية.

  ## التحوير (Mutation)

  بالنسبة إلى جداول عائلة `MergeTree`، تقوم الطفرة (mutation) بتعديل البيانات الموجودة أو حذفها عبر أوامر مثل `ALTER TABLE ... UPDATE` أو `ALTER TABLE ... DELETE`. وخلافًا لتحديث الصف في أنظمة OLTP، فإنها تعيد كتابة أجزاء البيانات المتأثرة وتُنفَّذ عادةً بشكل غير متزامن؛ إذ تُستبدل الأجزاء فور أن تصبح جاهزة، ولذلك فالعملية ليست معاملة ذرية تشمل الجدول بأكمله.

  ## عمود Nullable

  يجب أن يستخدم العمود النوع `Nullable(T)` لتمييز `NULL` عن القيم العادية من النوع `T`، بما في ذلك قيم مثل `0` أو سلسلة فارغة. يخزّن ClickHouse قناعاً منفصلاً للقيم الفارغة، ما يضيف عبئاً إضافياً على التخزين والمعالجة، لذا استخدم الأعمدة القابلة للقيم الفارغة عندما تحمل القيم المفقودة دلالة ذات معنى، لا كخيار افتراضي.

  ## الطفرة الفورية

  عند تفعيل `apply_mutations_on_fly` لكل من التعديل (mutation) وعمليات القراءة اللاحقة، يطبّق ClickHouse عمليات التحديث أو الحذف المعلّقة أثناء استعلامات `SELECT`، بحيث تظهر نتائجها قبل إعادة كتابة الأجزاء (parts) المخزّنة. ومع ذلك، يبقى تجسيد التعديل يجري بشكل غير متزامن في الخلفية.

  ## الأجزاء (Parts)

  جزء البيانات (data part) هو مجموعة ثابتة (غير قابلة للتعديل) من الملفات على وحدة التخزين تحتوي على جزء من صفوف الجدول. تُنشأ الأجزاء عن طريق عمليات الإدراج وتُدمج بواسطة عمليات الدمج في الخلفية داخل الـ partition. وعلى خلاف الـ partition الذي يمثل تجميعًا منطقيًا للبيانات، فإن الجزء وحدة تخزين فيزيائية تديرها ClickHouse.

  ## القسم (Partition)

  القسم (partition) هو تجميع منطقي لأجزاء البيانات (data parts) في جدول من عائلة `MergeTree`. ويُستخدم التقسيم (partitioning) في المقام الأول في عمليات إدارة البيانات مثل الحذف والنقل وتطبيق سياسات الاحتفاظ على مجموعات من البيانات. وقد يفيد تقليم الأقسام (partition pruning) الاستعلامات التي تحدد عددًا قليلًا من الأقسام فقط، إلا أن مفاتيح الفرز والمفاتيح الأساسية عادةً ما تكون أكثر أهمية لأداء الاستعلام.

  ## مفتاح التقسيم

  مفتاح التقسيم هو التعبير الوارد في جملة `PARTITION BY` الخاصة بالجدول. فالصفوف التي ينتج عنها معرّف القسم نفسه تنتمي إلى القسم المنطقي نفسه، بينما يمكن لعمليات الإدراج المنفصلة أن تنشئ أجزاء بيانات منفصلة داخل ذلك القسم. ويتيح هذا التجميع تنفيذ عمليات مثل حذف قسم كامل أو نقله أو أرشفته.

  ## المفتاح الأساسي

  بخلاف المفتاح الأساسي في كثير من قواعد البيانات المعاملاتية، لا يُعدّ المفتاح الأساسي في ClickHouse قيد تفرّد على مستوى الصف. فهو يحدّد الأعمدة المكوِّنة للفهرس الأساسي المتناثر الذي يساعد ClickHouse على تخطّي الحُبيبات أثناء القراءة. وهو يطابق افتراضيًا مفتاح الفرز المحدَّد بواسطة `ORDER BY`؛ أما إذا عُرِّف بشكل منفصل، فيجب أن يكون بادئة لمفتاح الفرز.

  ## الإسقاط (Projection)

  الإسقاط (projection) هو تمثيل يُدار تلقائيًا لبيانات الجدول بترتيب بديل، أو بمجموعة جزئية من الأعمدة، أو بتجميع محسوب مسبقًا. ويمكن لـ ClickHouse اختياره تلقائيًا عند الاستعلام عن الجدول الأصلي. وقد تؤدي الإسقاطات إلى تكرار البيانات المخزَّنة وزيادة كلفة الكتابة، رغم أن إسقاطات `_part_offset` تتيح المقايضة بين مساحة التخزين وقراءات إضافية من الجدول الأساسي.

  ## العرض المادي القابل للتحديث

  يعيد العرض المادي القابل للتحديث (refreshable materialized view) تنفيذ استعلامه دوريًا على مجموعة البيانات كاملة، ثم يستبدل النتيجة المخزّنة أو يُلحق بها وفق جدول زمني محدد. وعلى خلاف العرض المادي التزايدي (incremental materialized view)، لا يُشغَّل عند كل كتلة (block) مُدرَجة، ويمكنه استخدام استعلامات معقدة. كما يمكنه أن يحل محل استعلام مجدول يُجسِّد نتيجة `SELECT`، غير أنه ليس مجدولًا عام الغرض لتنفيذ عبارات DDL أو DML اعتباطية.

  ## `ReplacingMergeTree`

  يحاكي `ReplacingMergeTree` عمليات التحديث والـ upsert عبر قبول عدة إصدارات من الصفوف التي تشترك في مفتاح الفرز نفسه، مع الاحتفاظ بإصدار واحد أثناء عمليات الدمج في الخلفية. وتتم إزالة التكرار لاحقًا لا وقت الإدراج، أي أنها ليست ضمانًا للتفرد عند الإدراج، ولذلك قد ترى الاستعلامات عدة إصدارات إلى أن تستخدم `FINAL` أو منطق استعلام مكافئًا، أو إلى أن تُدمج الأجزاء المعنية.

  ## النسخة المتماثلة (Replica)

  النسخة المتماثلة (replica) هي خادم أو مثيل حوسبة يحتفظ ببيانات الجدول المنطقية نفسها التي تحتفظ بها النسخ المتماثلة الأخرى أو يصل إليها، بهدف تحقيق التوافر وزيادة سعة الاستعلام. فمع `ReplicatedMergeTree`، تحتفظ كل نسخة متماثلة بنسخة مستقلة من البيانات؛ أما النسخ المتماثلة في ClickHouse Cloud التي تستخدم `SharedMergeTree` فتتشارك تخزين الكائنات بدلًا من ذلك.

  ## الفهرس الثانوي

  في ClickHouse، عادةً ما يكون أقرب مكافئ للفهرس الثانوي التقليدي هو فهرس تخطي البيانات (data skipping index). فبدلاً من تحديد مواقع الصفوف الفردية عبر شجرة B، يخزّن بيانات وصفية لمجموعات من الحُبيبات (granules)، ما يتيح لـ ClickHouse تجنّب قراءة الكتل (blocks) التي لا يمكن أن تحتوي على قيم مطابقة.

  ## الجزء (Shard)

  الشظية (shard) هي مجموعة جزئية منطقية من بيانات الجدول تُسنَد إلى خادم واحد أو مجموعة نسخ متماثلة ضمن نشر موزَّع. تقسّم التجزئة (sharding) البيانات وعبء الاستعلامات بين الخوادم، بينما توفّر النسخ المتماثلة وصولاً احتياطياً أو متوازياً إلى البيانات داخل كل شظية.

  ## فهرس التخطي

  يخزّن فهرس تخطي البيانات (data skipping index) بيانات وصفية مضغوطة عن granule واحد أو أكثر من الـ granules المتتالية، بما يتيح لـ ClickHouse تجنّب قراءة الـ blocks التي يستحيل أن تطابق الاستعلام. ويبلغ أقصى فعاليته عندما ترتبط القيم المفهرسة بترتيب الجدول، وقد لا تكون فائدته تُذكر عندما ترد القيم المطابقة في معظم الـ blocks المفهرسة.

  ## مفتاح الفرز

  في الجداول من عائلة `MergeTree`، تُحدِّد عبارة `ORDER BY` مفتاح الفرز، أي الترتيب الفعلي للصفوف داخل كل جزء بيانات. وهي تؤدي غرضًا مشابهًا لأعمدة التجميع العنقودي أو مفاتيح التجميع العنقودي في قواعد البيانات التحليلية الأخرى، غير أن ClickHouse يستخدمها للحفاظ على ترتيب معجمي محدَّد للصفوف. وإذا لم يُحدَّد مفتاح أساسي منفصل، فإن مفتاح الفرز يصبح هو المفتاح الأساسي أيضًا؛ فالمفتاحان مترابطان لكن ليس من الضروري أن يكونا متطابقين.

  ## الفهرس المتناثر

  يخزّن الفهرس الأساسي المتناثر قيم المفاتيح لكل granule بدلًا من مُدخل واحد لكل صف. وتستخدم ClickHouse هذه المُدخلات لتحديد الـ granules المرشّحة ثم تقرأ صفوفها. ولأن حجمه يتناسب مع عدد الـ granules لا مع عدد الصفوف، فإنه يكون عادةً صغيرًا بما يكفي للاحتفاظ به في الذاكرة.

  ## محرك الجدول

  تحدد محركات الجداول في ClickHouse كيفية كتابة البيانات وتخزينها والوصول إليها. ويُعد `MergeTree` محرك الجداول الأكثر شيوعًا، إذ يتيح إدراج كميات كبيرة من البيانات بسرعة تتم معالجتها لاحقًا في الخلفية.

  ## المعاملة

  في ClickHouse، يختلف نطاق الضمانات المعاملاتية عمّا هو عليه في قواعد بيانات OLTP التقليدية. فعمليات الإدراج المستوفية للشروط تكون ذرّية على مستوى الـ block أو الـ partition، في حين أن المعاملات التقليدية متعددة العبارات التي تستخدم `COMMIT` و`ROLLBACK` لا تزال تجريبية وتخضع لقيود كبيرة.

  ## `TTL`

  تقوم قواعد `TTL` بنقل البيانات أو حذفها أو تجميعها بعد أن يصبح التعبير مستوفياً للشرط. غير أن انتهاء الصلاحية لا يحدث فوراً: إذ تطبّق ClickHouse عادةً الإجراءات الخاصة بالبيانات المنتهية الصلاحية أثناء عمليات الدمج في الخلفية، لذا قد تظل الصفوف المنتهية الصلاحية موجودة على القرص وتعيدها الاستعلامات إلى أن تعالج إحدى عمليات الدمج الأجزاء المعنية.

  ## التحديث

  تم تحسين ClickHouse للتعامل مع البيانات غير القابلة للتغيير وكثيفة الإلحاق (append)، لا مع التحديثات المتكررة للصفوف في مكانها. وعادةً ما تُنمذَج التحديثات عبر إدراج إصدارات جديدة باستخدام محركات جداول متخصصة، أو تُنفَّذ على هيئة mutations تعيد كتابة أجزاء البيانات المتأثرة.

  ## Upsert

  لا تنفّذ جداول عائلة `MergeTree` عملية upsert معاملاتية من نوع `INSERT ... ON CONFLICT`. وعادةً ما تُحاكى عمليات upsert بإدراج نسخة أحدث من الصف في محرك مثل `ReplacingMergeTree`. تُحسم النسخ الأقدم أثناء عمليات الدمج في الخلفية، لذا قد تحتاج الاستعلامات إلى `FINAL` أو منطق مكافئ إلى أن يتم الدمج.

  ## المستودع (Warehouse)

  في ClickHouse Cloud، المستودع (warehouse) هو مجموعة من الخدمات التي تتشارك البيانات نفسها لكن لكل منها موارد حوسبة و endpoints مستقلة. أما في الأنظمة التي يمثّل فيها المستودع عنقود حوسبة واحدًا، فإن خدمة ClickHouse المفردة هي النظير الأقرب، بينما يضم مستودع ClickHouse عدة خدمات.
</Glossary>
