Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

استعلامات مفيدة لاستكشاف الأخطاء وإصلاحها

استعلامات مفيدة لاستكشاف الأخطاء وإصلاحها

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

لدينا أيضًا مدونة ممتازة تتضمن بعض الاستعلامات الأساسية لمراقبة ClickHouse.

اعرض الإعدادات التي تم تغييرها عن الإعدادات الافتراضية

SELECT
    name,
    value
FROM system.settings
WHERE changed

اعرف حجم جميع جداولك

SELECT table,
    formatReadableSize(sum(bytes)) as size
    FROM system.parts
    WHERE active
GROUP BY table

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

┌─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  │
└─────────────────┴───────────┘

عدد الصفوف ومتوسط الحجم اليومي لجدولك

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
)

النسبة المئوية لضغط الأعمدة، وكذلك حجم الفهرس الأساسي في الذاكرة

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

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

عدد الاستعلامات التي أرسلها العميل خلال آخر 10 دقائق

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

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

عدد الأجزاء في كل قسم

SELECT
    concat(database, '.', table),
    partition_id,
    count()
FROM system.parts
WHERE active
GROUP BY
    database,
    table,
    partition_id

العثور على الاستعلامات طويلة التنفيذ

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

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';

عرض أحدث الأخطاء

SELECT *
FROM system.errors
ORDER BY last_error_time DESC

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

┌─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 │
└───────────────────────┴──────┴───────┴─────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────┴────────┘

أكثر 10 استعلامات استهلاكًا لـ CPU والذاكرة

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

ما مقدار مساحة القرص التي تستخدمها الإسقاطات

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

عرض مساحة تخزين القرص، وعدد الأجزاء، وعدد الصفوف في system.parts، وعدد العلامات عبر قواعد البيانات

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

اعرض تفاصيل الأجزاء الجديدة التي تمت كتابتها مؤخرًا

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

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

استعلامات المراقبة على مستوى العنقود بالكامل

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

متوسط عدد الأجزاء الجديدة المُنشأة في كل دقيقة وكل ثانية (خلال الساعة الأخيرة)

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' باسم الجدول الفعلي الذي تريد مراقبته.

الاستعلامات كثيفة الاستهلاك للـ CPU والذاكرة (على مستوى العنقود بالكامل)

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

عمليات الدمج الجارية مع الوقت التقديري للاكتمال

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

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

أكثر الاستعلامات شيوعًا حسب hash المُوحَّد

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

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

عدد الأخطاء حسب نوع الحدث والتاريخ

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

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

عدد الجداول حسب العقدة

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

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

تحقّق من عمليات الإدراج غير المتزامن

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

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

تحليل الأجزاء وعمليات الدمج

الأجزاء النشطة حاليًا لكل جدول

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

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

التقسيمات التي تحتوي على عدد كبير جدًا من الأجزاء

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

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

الأجزاء المفصولة

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

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

استعلامات معلومات النظام

استخدام الذاكرة على مستوى العنقود حسب العقدة

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

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

تشغيل الاستعلامات على العنقود

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

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

الإعدادات المعدَّلة مقارنةً بالقيم الافتراضية

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

SELECT
    hostName() AS host,
    name,
    value
FROM clusterAllReplicas(default, system.settings)
WHERE changed = 1
ORDER BY hostName(), name

حالة قائمة انتظار النسخ المتماثل

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

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
Navigation