Вы можете использовать функции, описанные в этой главе, для интроспекции ELF и DWARF для профилирования запросов.
примечание
Эти функции медленные и могут вызывать соображения безопасности.
Для правильной работы функций интроспекции:
-
Установите пакет clickhouse-common-static-dbg
.
-
Установите параметр allow_introspection_functions в 1.
По соображениям безопасности функции интроспекции отключены по умолчанию.
ClickHouse сохраняет отчеты профилирования в системную таблицу trace_log. Убедитесь, что таблица и профайлер настроены правильно.
demangle
Введено в: v20.1
Преобразует символ в имя функции C++.
Символ обычно возвращается функцией addressToSymbol
.
Синтаксис
Аргументы
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.
Синтаксис
Аргументы
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.
Синтаксис
Аргументы
- Нет.
Возвращаемое значение
Возвращает текущий id потока. UInt64
Примеры
Пример использования
┌─tid()─┐
│ 3878 │
└───────┘