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

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

Вы можете использовать функции, описанные в этой главе, для интроспекции 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;
-- Поле `trace` содержит трассировку стека в момент сэмплирования.
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;
Строка 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;

-- Функция arrayMap позволяет обработать каждый элемент массива trace с помощью функции demangle.
-- Результат обработки отображается в столбце trace_functions.

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

Выводит сообщение трассировки в лог сервера для каждого блока.

Синтаксис

logTrace(message)

Аргументы

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

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

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

Примеры

Базовый пример

SELECT logTrace('сообщение logTrace');
┌─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

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

Синтаксис

tid()

Аргументы

  • Отсутствуют.

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

Возвращает идентификатор текущего потока. UInt64

Примеры

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

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