Перейти к основному содержимому
Перейти к основному содержимому

Функции интроспекции

Вы можете использовать функции, описанные в этой главе, для интроспекции ELF и DWARF для профилирования запросов.

примечание

Эти функции медленные и могут вызывать соображения безопасности.

Для правильной работы функций интроспекции:

  • Установите пакет clickhouse-common-static-dbg.

  • Установите параметр allow_introspection_functions в 1.

    По соображениям безопасности функции интроспекции отключены по умолчанию.

ClickHouse сохраняет отчеты профилирования в системную таблицу trace_log. Убедитесь, что таблица и профайлер настроены правильно.

demangle

Введено в: v20.1

Преобразует символ в имя функции C++. Символ обычно возвращается функцией addressToSymbol.

Синтаксис

demangle(symbol)

Аргументы

  • symbol — Символ из объектного файла. String

Возвращаемое значение

Возвращает имя функции C++, или пустую строку, если символ недействителен. String

Примеры

Выбор первой строки из системной таблицы trace_log

SELECT * FROM system.trace_log LIMIT 1 \G;
-- The `trace` field contains the stack trace at the moment of sampling.
Row 1:
──────
event_date:    2019-11-20
event_time:    2019-11-20 16:57:59
revision:      54429
timer_type:    Real
thread_number: 48
query_id:      724028bf-f550-45aa-910d-2af6212b94ac
trace:         [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583]

Получение имени функции для одного адреса

SET allow_introspection_functions=1;
SELECT demangle(addressToSymbol(94138803686098)) \G;
Row 1:
──────
demangle(addressToSymbol(94138803686098)): DB::IAggregateFunctionHelper<DB::AggregateFunctionSum<unsigned long, unsigned long, DB::AggregateFunctionSumData<unsigned long> > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const

Применение функции к всему стеку вызовов

SET allow_introspection_functions=1;

-- The arrayMap function allows to process each individual element of the trace array by the demangle function.
-- The result of this processing is shown in the trace_functions column of output.

SELECT
    arrayStringConcat(arrayMap(x -> demangle(addressToSymbol(x)), trace), '\n') AS trace_functions
FROM system.trace_log
LIMIT 1
\G
Row 1:
──────
trace_functions: DB::IAggregateFunctionHelper<DB::AggregateFunctionSum<unsigned long, unsigned long, DB::AggregateFunctionSumData<unsigned long> > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const
DB::Aggregator::executeWithoutKeyImpl(char*&, unsigned long, DB::Aggregator::AggregateFunctionInstruction*, DB::Arena*) const
DB::Aggregator::executeOnBlock(std::vector<COW<DB::IColumn>::immutable_ptr<DB::IColumn>, std::allocator<COW<DB::IColumn>::immutable_ptr<DB::IColumn> > >, unsigned long, DB::AggregatedDataVariants&, std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> >&, std::vector<std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> >, std::allocator<std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> > > >&, bool&)
DB::Aggregator::executeOnBlock(DB::Block const&, DB::AggregatedDataVariants&, std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> >&, std::vector<std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> >, std::allocator<std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> > > >&, bool&)
DB::Aggregator::execute(std::shared_ptr<DB::IBlockInputStream> const&, DB::AggregatedDataVariants&)
DB::AggregatingBlockInputStream::readImpl()
DB::IBlockInputStream::read()
DB::ExpressionBlockInputStream::readImpl()
DB::IBlockInputStream::read()
DB::ExpressionBlockInputStream::readImpl()
DB::IBlockInputStream::read()
DB::AsynchronousBlockInputStream::calculate()
std::_Function_handler<void (), DB::AsynchronousBlockInputStream::next()::{lambda()#1}>::_M_invoke(std::_Any_data const&)
ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::_List_iterator<ThreadFromGlobalPool>)
ThreadFromGlobalPool::ThreadFromGlobalPool<ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::function<void ()>, int, std::optional<unsigned long>)::{lambda()#3}>(ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::function<void ()>, int, std::optional<unsigned long>)::{lambda()#3}&&)::{lambda()#1}::operator()() const
ThreadPoolImpl<std::thread>::worker(std::_List_iterator<std::thread>)
execute_native_thread_routine
start_thread
clone

isMergeTreePartCoveredBy

Введено в: v25.6

Функция, которая проверяет, покрыта ли часть первого аргумента частью второго аргумента.

Синтаксис

isMergeTreePartCoveredBy(nested_part, covering_part)

Аргументы

  • nested_part — Имя ожидаемой вложенной части. String
  • covering_part — Имя ожидаемой покрывающей части. String

Возвращаемое значение

Возвращает 1, если покрывает, 0 в противном случае. UInt8

Примеры

Простой пример

WITH 'all_12_25_7_4' AS lhs, 'all_7_100_10_20' AS rhs
SELECT isMergeTreePartCoveredBy(rhs, lhs), isMergeTreePartCoveredBy(lhs, rhs);
┌─isMergeTreePartCoveredBy(rhs, lhs)─┬─isMergeTreePartCoveredBy(lhs, rhs)─┐
│                                  0 │                                  1 │
└────────────────────────────────────┴────────────────────────────────────┘

logTrace

Введено в: v20.12

Генерирует сообщение трассировки в серверный лог для каждого Block.

Синтаксис

logTrace(message)

Аргументы

  • message — Сообщение, которое записывается в серверный лог. const String

Возвращаемое значение

Всегда возвращает 0. UInt8

Примеры

Простой пример

SELECT logTrace('logTrace message');
┌─logTrace('logTrace message')─┐
│                            0 │
└──────────────────────────────┘

mergeTreePartInfo

Введено в: v25.6

Функция, которая помогает извлечь полезные значения из имени части MergeTree.

Синтаксис

mergeTreePartInfo(part_name)

Аргументы

  • part_name — Имя части для распаковки. String

Возвращаемое значение

Возвращает кортеж с подколонками: partition_id, min_block, max_block, level, mutation. Tuple

Примеры

Простой пример

WITH mergeTreePartInfo('all_12_25_7_4') AS info
SELECT info.partition_id, info.min_block, info.max_block, info.level, info.mutation;
┌─info.partition_id─┬─info.min_block─┬─info.max_block─┬─info.level─┬─info.mutation─┐
│ all               │             12 │             25 │          7 │             4 │
└───────────────────┴────────────────┴────────────────┴────────────┴───────────────┘

tid

Введено в: v20.12

Возвращает id потока, в котором обрабатывается текущий Block.

Синтаксис

tid()

Аргументы

  • Нет. Возвращаемое значение

Возвращает текущий id потока. UInt64

Примеры

Пример использования

SELECT tid();
┌─tid()─┐
│  3878 │
└───────┘