> ## 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 وإصلاحها، بما في ذلك مراقبة أحجام الجداول، والاستعلامات التي تستغرق وقتًا طويلًا، والأخطاء.

{frontMatter.description}

<div id="useful-queries-for-troubleshooting">
  ## استعلامات مفيدة لاستكشاف الأخطاء وإصلاحها
</div>

فيما يلي، دون ترتيب معيّن، بعض الاستعلامات المفيدة لاستكشاف مشكلات ClickHouse وفهم ما يحدث.

لدينا أيضًا مدونة ممتازة تتضمن بعض [الاستعلامات الأساسية لمراقبة ClickHouse](https://clickhouse.com/blog/monitoring-troubleshooting-select-queries-clickhouse).

<div id="view-which-settings-have-been-changed-from-the-default">
  ## اعرض الإعدادات التي تم تغييرها عن الإعدادات الافتراضية
</div>

```sql theme={null}
SELECT
    name,
    value
FROM system.settings
WHERE changed
```

<div id="get-the-size-of-all-your-tables">
  ## اعرف حجم جميع جداولك
</div>

```sql theme={null}
SELECT table,
    formatReadableSize(sum(bytes)) as size
    FROM system.parts
    WHERE active
GROUP BY table
```

تكون الاستجابة على النحو التالي:

```response theme={null}
┌─table───────────┬─size──────┐
│ stat            │ 38.89 MiB │
│ customers       │ 525.00 B  │
│ my_sparse_table │ 40.73 MiB │
│ crypto_prices   │ 32.18 MiB │
│ hackernews      │ 6.23 GiB  │
└─────────────────┴───────────┘
```

<div id="row-count-and-average-day-size-of-your-table">
  ## عدد الصفوف ومتوسط الحجم اليومي لجدولك
</div>

```sql theme={null}
SELECT
    table,
    formatReadableSize(size) AS size,
    rows,
    days,
    formatReadableSize(avgDaySize) AS avgDaySize
FROM
(
    SELECT
        table,
        sum(bytes) AS size,
        sum(rows) AS rows,
        min(min_date) AS min_date,
        max(max_date) AS max_date,
        max_date - min_date AS days,
        size / (max_date - min_date) AS avgDaySize
    FROM system.parts
    WHERE active
    GROUP BY table
    ORDER BY rows DESC
)
```

<div id="compression-columns-percentage-as-well-as-the-size-of-primary-index-in-memory">
  ## النسبة المئوية لضغط الأعمدة، وكذلك حجم الفهرس الأساسي في الذاكرة
</div>

يمكنك معرفة مدى انضغاط بياناتك في كل عمود. كما يُرجع هذا الاستعلام أيضًا حجم الفهارس الأساسية لديك في الذاكرة، وهو أمر مفيد لأن الفهارس الأساسية يجب أن تتسع في الذاكرة.

```sql theme={null}
SELECT
    parts.*,
    columns.compressed_size,
    columns.uncompressed_size,
    columns.compression_ratio,
    columns.compression_percentage
FROM
(
    SELECT
        table,
        formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size,
        formatReadableSize(sum(data_compressed_bytes)) AS compressed_size,
        round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes), 3) AS compression_ratio,
        round(100 - ((sum(data_compressed_bytes) * 100) / sum(data_uncompressed_bytes)), 3) AS compression_percentage
    FROM system.columns
    GROUP BY table
) AS columns
RIGHT JOIN
(
    SELECT
        table,
        sum(rows) AS rows,
        max(modification_time) AS latest_modification,
        formatReadableSize(sum(bytes)) AS disk_size,
        formatReadableSize(sum(primary_key_bytes_in_memory)) AS primary_keys_size,
        any(engine) AS engine,
        sum(bytes) AS bytes_size
    FROM system.parts
    WHERE active
    GROUP BY
        database,
        table
) AS parts ON columns.table = parts.table
ORDER BY parts.bytes_size DESC
```

<div id="number-of-queries-sent-by-client-in-the-last-10-minutes">
  ## عدد الاستعلامات التي أرسلها العميل خلال آخر 10 دقائق
</div>

يمكنك زيادة الفاصل الزمني أو تقليله في الدالة `toIntervalMinute(10)`:

```sql theme={null}
SELECT
    client_name,
    count(),
    query_kind,
    toStartOfMinute(event_time) AS event_time_m
FROM system.query_log
WHERE (type = 'QueryStart') AND (event_time > (now() - toIntervalMinute(10)))
GROUP BY
    event_time_m,
    client_name,
    query_kind
ORDER BY
    event_time_m DESC,
    count() ASC
```

<div id="number-of-parts-in-each-partition">
  ## عدد الأجزاء في كل قسم
</div>

```sql theme={null}
SELECT
    concat(database, '.', table),
    partition_id,
    count()
FROM system.parts
WHERE active
GROUP BY
    database,
    table,
    partition_id
```

<div id="finding-long-running-queries">
  ## العثور على الاستعلامات طويلة التنفيذ
</div>

يمكن أن يساعدك هذا في العثور على الاستعلامات العالقة:

```sql theme={null}
SELECT
    elapsed,
    initial_user,
    client_name,
    hostname(),
    query_id,
    query
FROM clusterAllReplicas(default, system.processes)
ORDER BY elapsed DESC
```

باستخدام معرّف الاستعلام الخاص بالاستعلام الجاري الأسوأ أداءً، يمكننا الحصول على تتبّع للمكدس يمكن أن يساعد في تصحيح الأخطاء.

```
SET allow_introspection_functions=1;

SELECT
    arrayStringConcat(
        arrayMap(
            x,
            y -> concat(x, ': ', y),
            arrayMap(x -> addressToLine(x), trace),
            arrayMap(x -> demangle(addressToSymbol(x)), trace)
        ),
        '\n'
    ) as trace
FROM
    system.stack_trace
WHERE
    query_id = '0bb6e88b-9b9a-4ffc-b612-5746c859e360';
```

<div id="view-the-most-recent-errors">
  ## عرض أحدث الأخطاء
</div>

```
SELECT *
FROM system.errors
ORDER BY last_error_time DESC
```

تكون الاستجابة كما يلي:

```response theme={null}
┌─name──────────────────┬─code─┬─value─┬─────last_error_time─┬─last_error_message──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─last_error_trace─┬─remote─┐
│ UNKNOWN_TABLE         │   60 │     3 │ 2023-03-14 01:02:35 │ Table system.stack_trace doesn't exist                                                                                                              │ []               │      0 │
│ BAD_GET               │  170 │     1 │ 2023-03-14 00:58:55 │ Requested cluster 'default' not found                                                                                                               │ []               │      0 │
│ UNKNOWN_IDENTIFIER    │   47 │     1 │ 2023-03-14 00:49:12 │ Missing columns: 'parts.table' 'table' while processing query: 'table = parts.table', required columns: 'table' 'parts.table' 'table' 'parts.table' │ []               │      0 │
│ NO_ELEMENTS_IN_CONFIG │  139 │     2 │ 2023-03-14 00:42:11 │ Certificate file is not set.                                                                                                                        │ []               │      0 │
└───────────────────────┴──────┴───────┴─────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────┴────────┘
```

<div id="top-10-queries-that-are-using-the-most-cpu-and-memory">
  ## أكثر 10 استعلامات استهلاكًا لـ CPU والذاكرة
</div>

```sql theme={null}
SELECT
    type,
    event_time,
    initial_query_id,
    formatReadableSize(memory_usage) AS memory,
    `ProfileEvents.Values`[indexOf(`ProfileEvents.Names`, 'UserTimeMicroseconds')] AS userCPU,
    `ProfileEvents.Values`[indexOf(`ProfileEvents.Names`, 'SystemTimeMicroseconds')] AS systemCPU,
    normalizedQueryHash(query) AS normalized_query_hash
FROM system.query_log
ORDER BY memory_usage DESC
LIMIT 10
```

<Note>
  يمكن تسجيل query واحد على هيئة عدة rows بقيم `query_id` مختلفة — إذ تكون قيمة `is_initial_query = 0` في الاستعلامات الثانوية الموزعة وخطوات العرض الداخلية. صفِّ النتائج باستخدام `is_initial_query = 1` (أو `query_id = initial_query_id`) لعرض الاستعلامات بالشكل الذي أُرسلت به، ولاحظ أن قيم `query_id` الداخلية التي يعيّنها ClickHouse قد تتضمن label مثل `queryView...`. راجع [مرجع `query_log`](/ar/reference/system-tables/query_log) لمزيد من التفاصيل.
</Note>

<div id="how-much-disk-space-are-my-projection-using">
  ## ما مقدار مساحة القرص التي تستخدمها الإسقاطات
</div>

```sql theme={null}
SELECT
    name,
    parent_name,
    formatReadableSize(bytes_on_disk) AS bytes,
    formatReadableSize(parent_bytes_on_disk) AS parent_bytes,
    bytes_on_disk / parent_bytes_on_disk AS ratio
FROM system.projection_parts
```

<div id="show-disk-storage-number-of-parts-number-of-rows-in-systemparts-and-marks-across-databases">
  ## عرض مساحة تخزين القرص، وعدد الأجزاء، وعدد الصفوف في system.parts، وعدد العلامات عبر قواعد البيانات
</div>

```sql theme={null}
SELECT
    database,
    table,
    partition,
    count() AS parts,
    formatReadableSize(sum(bytes_on_disk)) AS bytes_on_disk,
    formatReadableQuantity(sum(rows)) AS rows,
    sum(marks) AS marks
FROM system.parts
WHERE (database != 'system') AND active
GROUP BY
    database,
    table,
    partition
ORDER BY database ASC
```

<div id="list-details-of-recently-written-new-parts">
  ## اعرض تفاصيل الأجزاء الجديدة التي تمت كتابتها مؤخرًا
</div>

تشمل هذه التفاصيل وقت إنشائها، وحجمها، وعدد الصفوف فيها، وغير ذلك:

```sql theme={null}
SELECT
    modification_time,
    rows,
    formatReadableSize(bytes_on_disk),
    *
FROM clusterAllReplicas(default, system.parts)
WHERE (database = 'default') AND active AND (level = 0)
ORDER BY modification_time DESC
LIMIT 100
```

<div id="cluster-wide-monitoring-queries">
  ## استعلامات المراقبة على مستوى العنقود بالكامل
</div>

الاستعلامات التالية مفيدة لمراقبة عناقيد ClickHouse. وهي تستخدم `clusterAllReplicas()` لتجميع البيانات عبر جميع العُقد.

<Note>
  تفترض هذه الاستعلامات أن اسم العنقود هو `default`. إذا كان لعنقودك اسم مختلف، فاستبدل `'default'` و `default` بالاسم الفعلي لعنقودك.
</Note>

<div id="avg-new-parts-per-minute-and-second">
  ### متوسط عدد الأجزاء الجديدة المُنشأة في كل دقيقة وكل ثانية (خلال الساعة الأخيرة)
</div>

```sql theme={null}
WITH
    PER_MINUTE AS
    (
    SELECT
        toStartOfInterval(modification_time, toIntervalMinute(1)) AS t,
        count() AS new_part_count
    FROM
        clusterAllReplicas(default, merge(system, '^parts'))
    WHERE
        (database = 'default') AND
        (table = 'your_table') AND
        (active = true) AND
        (level = 0) AND
        (modification_time >= (now() - toIntervalHour(1)))
    GROUP BY
        t
    ORDER BY
        t ASC
    SETTINGS skip_unavailable_shards = 1
    )
SELECT
    AVG(new_part_count) AS new_parts_per_minute,
    new_parts_per_minute / 60 AS new_parts_per_second
FROM
    PER_MINUTE
```

استبدل `'your_table'` باسم الجدول الفعلي الذي تريد مراقبته.

<div id="cpu-and-memory-intensive-queries-cluster-wide">
  ### الاستعلامات كثيفة الاستهلاك للـ CPU والذاكرة (على مستوى العنقود بالكامل)
</div>

```sql theme={null}
SELECT
    type,
    event_time,
    initial_query_id,
    formatReadableSize(memory_usage) AS memory,
    `ProfileEvents.Values`[indexOf(`ProfileEvents.Names`, 'UserTimeMicroseconds')] AS userCPU,
    `ProfileEvents.Values`[indexOf(`ProfileEvents.Names`, 'SystemTimeMicroseconds')] AS systemCPU,
    normalizedQueryHash(query) AS normalized_query_hash
FROM clusterAllReplicas(default, merge(system, '^query_log'))
ORDER BY memory_usage DESC
LIMIT 10
```

<div id="merges-in-progress-with-eta">
  ### عمليات الدمج الجارية مع الوقت التقديري للاكتمال
</div>

يعرض هذا الاستعلام عمليات الدمج الجاري تنفيذها حاليًا على العنقود، مع الوقت التقديري حتى اكتمالها:

```sql theme={null}
SELECT
    hostName(),
    database,
    table,
    round(elapsed, 0) AS elapsed_seconds,
    round(progress, 4) AS progress_ratio,
    formatReadableTimeDelta((elapsed / progress) - elapsed) AS estimated_time_remaining,
    num_parts,
    result_part_name
FROM clusterAllReplicas(default, merge(system, '^merges'))
ORDER BY (elapsed / progress) - elapsed ASC
```

<div id="most-common-queries-by-normalized-hash">
  ### أكثر الاستعلامات شيوعًا حسب hash المُوحَّد
</div>

حدِّد الاستعلامات الأكثر تنفيذًا (وهذا مفيد لتحديد الاستعلامات التي ينبغي تحسينها):

```sql theme={null}
SELECT
    normalizedQueryHash(query) AS query_hash,
    count() AS execution_count,
    any(query) AS example_query
FROM clusterAllReplicas(default, merge(system, '^query_log'))
WHERE event_date >= today() - 1
GROUP BY normalizedQueryHash(query)
ORDER BY execution_count DESC
LIMIT 20
```

<div id="error-counts-by-event-type-and-date">
  ### عدد الأخطاء حسب نوع الحدث والتاريخ
</div>

حلّل أخطاء إنشاء الأجزاء على مستوى العنقود:

```sql theme={null}
SELECT
    event_date,
    event_type,
    table,
    error,
    COUNT() AS error_count
FROM clusterAllReplicas(default, merge(system, '^part_log'))
WHERE database = 'default'
GROUP BY
    event_date,
    event_type,
    error,
    table
ORDER BY
    event_date DESC,
    error_count DESC
```

<div id="number-of-tables-by-node">
  ### عدد الجداول حسب العقدة
</div>

افحص توزيع الجداول عبر عُقد العنقود:

```sql theme={null}
SELECT
    hostName() AS host,
    count() AS table_count
FROM clusterAllReplicas('default', merge(system, '^tables'))
WHERE database = 'default'
GROUP BY hostName()
ORDER BY table_count DESC
```

<div id="check-for-async-insert-operations">
  ### تحقّق من عمليات الإدراج غير المتزامن
</div>

راقب نشاط الإدراج غير المتزامن:

```sql theme={null}
SELECT
    event_date,
    count() AS total_count,
    sum(if(query LIKE '%async%', 1, 0)) AS async_count,
    sum(if(query LIKE '%INSERT%', 1, 0)) AS insert_count
FROM clusterAllReplicas(default, merge(system, '^query_log'))
WHERE event_date >= today() - 7
GROUP BY event_date
ORDER BY event_date DESC
```

<div id="parts-and-merges-analysis">
  ## تحليل الأجزاء وعمليات الدمج
</div>

<div id="currently-active-parts-by-table">
  ### الأجزاء النشطة حاليًا لكل جدول
</div>

اطّلع على عدد الأجزاء النشطة لكل جدول على مستوى العنقود:

```sql theme={null}
SELECT
    database,
    table,
    count() AS part_count,
    formatReadableSize(sum(bytes_on_disk)) AS total_size
FROM clusterAllReplicas(default, system.parts)
WHERE active = 1 AND database = 'default'
GROUP BY database, table
ORDER BY part_count DESC
```

<div id="partitions-with-too-many-parts">
  ### التقسيمات التي تحتوي على عدد كبير جدًا من الأجزاء
</div>

اعثر على التقسيمات التي قد تحتوي على عدد كبير جدًا من الأجزاء (ما قد يؤثر في أداء الاستعلام):

```sql theme={null}
SELECT
    database,
    table,
    partition,
    count() AS part_count,
    formatReadableSize(sum(bytes_on_disk)) AS total_size
FROM clusterAllReplicas(default, system.parts)
WHERE active = 1
GROUP BY database, table, partition
HAVING part_count > 100
ORDER BY part_count DESC
```

<div id="detached-parts">
  ### الأجزاء المفصولة
</div>

تحقق من وجود الأجزاء المفصولة التي قد تحتاج إلى التحقق منها:

```sql theme={null}
SELECT
    database,
    table,
    partition_id,
    name,
    reason,
    count()
FROM clusterAllReplicas(default, system.detached_parts)
GROUP BY database, table, partition_id, name, reason
ORDER BY database, table
```

<div id="system-information-queries">
  ## استعلامات معلومات النظام
</div>

<div id="cluster-wide-memory-usage-by-node">
  ### استخدام الذاكرة على مستوى العنقود حسب العقدة
</div>

راقب استهلاك الذاكرة عبر جميع العقد:

```sql theme={null}
SELECT
    hostName() AS host,
    formatReadableSize(max(memory_usage)) AS peak_memory,
    formatReadableSize(avg(memory_usage)) AS avg_memory,
    formatReadableSize(min(memory_usage)) AS min_memory
FROM clusterAllReplicas(default, merge(system, '^query_log'))
WHERE event_date >= today() - 1
GROUP BY hostName()
ORDER BY peak_memory DESC
```

<div id="running-queries-on-the-cluster">
  ### تشغيل الاستعلامات على العنقود
</div>

تحقّق من الاستعلامات التي يجري تنفيذها حاليًا:

```sql theme={null}
SELECT
    hostName() AS host,
    initial_user,
    query_id,
    elapsed,
    read_rows,
    formatReadableSize(memory_usage) AS memory_usage,
    normalizedQueryHash(query) AS query_hash
FROM clusterAllReplicas(default, system.processes)
ORDER BY elapsed DESC
```

<div id="modified-settings-from-defaults">
  ### الإعدادات المعدَّلة مقارنةً بالقيم الافتراضية
</div>

اطّلع على الإعدادات التي تغيّرت مقارنةً بالقيم الافتراضية:

```sql theme={null}
SELECT
    hostName() AS host,
    name,
    value
FROM clusterAllReplicas(default, system.settings)
WHERE changed = 1
ORDER BY hostName(), name
```

<div id="replication-queue-status">
  ### حالة قائمة انتظار النسخ المتماثل
</div>

بالنسبة إلى الجداول التي تستخدم النسخ المتماثل، تحقّق من قائمة انتظار النسخ المتماثل:

```sql theme={null}
SELECT
    hostName() AS host,
    database,
    table,
    count() AS queue_size,
    sum(if(is_currently_executing = 1, 1, 0)) AS executing_count
FROM clusterAllReplicas(default, system.replication_queue)
GROUP BY hostName(), database, table
HAVING queue_size > 0
ORDER BY queue_size DESC
```
