2012-03-05 00:09:41 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2012-07-26 20:16:57 +00:00
|
|
|
|
#include <Poco/Timespan.h>
|
2014-02-13 07:17:22 +00:00
|
|
|
|
#include <Poco/Util/AbstractConfiguration.h>
|
2012-03-05 00:09:41 +00:00
|
|
|
|
#include <DB/Core/Defines.h>
|
2012-08-02 19:03:32 +00:00
|
|
|
|
#include <DB/Core/Field.h>
|
2012-03-05 00:09:41 +00:00
|
|
|
|
|
2012-12-24 19:50:22 +00:00
|
|
|
|
#include <DB/Interpreters/Limits.h>
|
2014-02-17 23:56:45 +00:00
|
|
|
|
#include <DB/Interpreters/SettingsCommon.h>
|
2012-12-24 19:50:22 +00:00
|
|
|
|
|
2012-03-05 00:09:41 +00:00
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/** Настройки выполнения запроса.
|
|
|
|
|
*/
|
|
|
|
|
struct Settings
|
|
|
|
|
{
|
2014-02-17 23:56:45 +00:00
|
|
|
|
/** Перечисление настроек: тип, имя, значение по-умолчанию.
|
|
|
|
|
*
|
|
|
|
|
* Это сделано несколько неудобно, чтобы не перечислять настройки во многих разных местах.
|
|
|
|
|
* Замечание: можно было бы сделать полностью динамические настройки вида map: String -> Field,
|
|
|
|
|
* но пока рано, так как в коде они используются как статический struct.
|
2013-09-07 02:03:13 +00:00
|
|
|
|
*/
|
2013-12-10 17:07:06 +00:00
|
|
|
|
|
2014-02-17 23:56:45 +00:00
|
|
|
|
#define APPLY_FOR_SETTINGS(M) \
|
2014-04-08 15:29:12 +00:00
|
|
|
|
/** При записи данных, для сжатия выделяется буфер размером max_compress_block_size. При переполнении буфера или если в буфер */ \
|
|
|
|
|
/** записано данных больше или равно, чем min_compress_block_size, то при очередной засечке, данные так же будут сжиматься */ \
|
|
|
|
|
/** В результате, для маленьких столбцов (числа 1-8 байт), при index_granularity = 8192, размер блока будет 64 KБ. */ \
|
|
|
|
|
/** А для больших столбцов (Title - строка ~100 байт), размер блока будет ~819 КБ. */ \
|
|
|
|
|
/** За счёт этого, коэффициент сжатия почти не ухудшится. */ \
|
2014-03-28 14:36:24 +00:00
|
|
|
|
M(SettingUInt64, min_compress_block_size, DEFAULT_MIN_COMPRESS_BLOCK_SIZE) \
|
|
|
|
|
M(SettingUInt64, max_compress_block_size, DEFAULT_MAX_COMPRESS_BLOCK_SIZE) \
|
2014-02-17 23:56:45 +00:00
|
|
|
|
/** Максимальный размер блока для чтения */ \
|
|
|
|
|
M(SettingUInt64, max_block_size, DEFAULT_BLOCK_SIZE) \
|
2014-04-29 20:22:57 +00:00
|
|
|
|
/** Максимальный размер блока для вставки, если мы управляем формированием блоков для вставки. */ \
|
|
|
|
|
M(SettingUInt64, max_insert_block_size, DEFAULT_INSERT_BLOCK_SIZE) \
|
2015-02-22 10:50:36 +00:00
|
|
|
|
/** Максимальное количество потоков выполнения запроса. По-умолчанию - определять автоматически. */ \
|
|
|
|
|
M(SettingMaxThreads, max_threads, 0) \
|
2015-04-12 04:39:20 +00:00
|
|
|
|
/** Максимальный размер буфера для чтения из файловой системы. */ \
|
|
|
|
|
M(SettingUInt64, max_read_buffer_size, DBMS_DEFAULT_BUFFER_SIZE) \
|
2014-02-17 23:56:45 +00:00
|
|
|
|
/** Максимальное количество соединений при распределённой обработке одного запроса (должно быть больше, чем max_threads). */ \
|
|
|
|
|
M(SettingUInt64, max_distributed_connections, DEFAULT_MAX_DISTRIBUTED_CONNECTIONS) \
|
|
|
|
|
/** Какую часть запроса можно прочитать в оперативку для парсинга (оставшиеся данные для INSERT, если есть, считываются позже) */ \
|
|
|
|
|
M(SettingUInt64, max_query_size, DEFAULT_MAX_QUERY_SIZE) \
|
|
|
|
|
/** Интервал в микросекундах для проверки, не запрошена ли остановка выполнения запроса, и отправки прогресса. */ \
|
|
|
|
|
M(SettingUInt64, interactive_delay, DEFAULT_INTERACTIVE_DELAY) \
|
|
|
|
|
M(SettingSeconds, connect_timeout, DBMS_DEFAULT_CONNECT_TIMEOUT_SEC) \
|
|
|
|
|
/** Если следует выбрать одну из рабочих реплик. */ \
|
|
|
|
|
M(SettingMilliseconds, connect_timeout_with_failover_ms, DBMS_DEFAULT_CONNECT_TIMEOUT_WITH_FAILOVER_MS) \
|
|
|
|
|
M(SettingSeconds, receive_timeout, DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC) \
|
|
|
|
|
M(SettingSeconds, send_timeout, DBMS_DEFAULT_SEND_TIMEOUT_SEC) \
|
|
|
|
|
/** Время ожидания в очереди запросов, если количество одновременно выполняющихся запросов превышает максимальное. */ \
|
|
|
|
|
M(SettingMilliseconds, queue_max_wait_ms, DEFAULT_QUERIES_QUEUE_WAIT_TIME_MS) \
|
|
|
|
|
/** Блокироваться в цикле ожидания запроса в сервере на указанное количество секунд. */ \
|
|
|
|
|
M(SettingUInt64, poll_interval, DBMS_DEFAULT_POLL_INTERVAL) \
|
|
|
|
|
/** Максимальное количество соединений с одним удалённым сервером в пуле. */ \
|
|
|
|
|
M(SettingUInt64, distributed_connections_pool_size, DBMS_DEFAULT_DISTRIBUTED_CONNECTIONS_POOL_SIZE) \
|
|
|
|
|
/** Максимальное количество попыток соединения с репликами. */ \
|
|
|
|
|
M(SettingUInt64, connections_with_failover_max_tries, DBMS_CONNECTION_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES) \
|
|
|
|
|
/** Считать минимумы и максимумы столбцов результата. Они могут выводиться в JSON-форматах. */ \
|
|
|
|
|
M(SettingBool, extremes, false) \
|
|
|
|
|
/** Использовать ли кэш разжатых блоков. */ \
|
|
|
|
|
M(SettingBool, use_uncompressed_cache, true) \
|
|
|
|
|
/** Следует ли отменять выполняющийся запрос с таким же id, как новый. */ \
|
|
|
|
|
M(SettingBool, replace_running_query, false) \
|
2014-07-02 12:30:38 +00:00
|
|
|
|
/** Количество потоков, выполняющих фоновую работу для таблиц (например, слияние в merge tree). \
|
|
|
|
|
* TODO: Сейчас применяется только при запуске сервера. Можно сделать изменяемым динамически. */ \
|
|
|
|
|
M(SettingUInt64, background_pool_size, DBMS_DEFAULT_BACKGROUND_POOL_SIZE) \
|
2014-02-17 23:56:45 +00:00
|
|
|
|
\
|
2014-08-15 09:50:05 +00:00
|
|
|
|
/** Sleep time for StorageDistributed DirectoryMonitors in case there is no work or exception has been thrown */ \
|
|
|
|
|
M(SettingMilliseconds, distributed_directory_monitor_sleep_time_ms, DBMS_DISTRIBUTED_DIRECTORY_MONITOR_SLEEP_TIME_MS) \
|
|
|
|
|
\
|
2014-10-01 13:40:50 +00:00
|
|
|
|
/** Allows disabling WHERE to PREWHERE optimization in SELECT queries from MergeTree */ \
|
2015-05-21 16:26:23 +00:00
|
|
|
|
M(SettingBool, optimize_move_to_prewhere, true) \
|
2014-10-01 13:40:50 +00:00
|
|
|
|
\
|
2014-10-18 19:14:09 +00:00
|
|
|
|
/** Ожидать выполнения действий по манипуляции с партициями. 0 - не ждать, 1 - ждать выполнения только у себя, 2 - ждать всех. */ \
|
|
|
|
|
M(SettingUInt64, replication_alter_partitions_sync, 1) \
|
|
|
|
|
\
|
2014-02-17 23:56:45 +00:00
|
|
|
|
M(SettingLoadBalancing, load_balancing, LoadBalancing::RANDOM) \
|
2014-02-27 13:12:56 +00:00
|
|
|
|
\
|
2014-12-05 19:37:23 +00:00
|
|
|
|
M(SettingTotalsMode, totals_mode, TotalsMode::AFTER_HAVING_EXCLUSIVE) \
|
2014-02-27 13:12:56 +00:00
|
|
|
|
M(SettingFloat, totals_auto_threshold, 0.5) \
|
2014-02-17 23:56:45 +00:00
|
|
|
|
\
|
|
|
|
|
/** Сэмплирование по умолчанию. Если равно 1, то отключено. */ \
|
|
|
|
|
M(SettingFloat, default_sample, 1.0) \
|
2015-01-10 02:30:03 +00:00
|
|
|
|
\
|
|
|
|
|
/** Включена ли компиляция запросов. */ \
|
|
|
|
|
M(SettingBool, compile, false) \
|
|
|
|
|
/** Количество одинаковых по структуре запросов перед тем, как инициируется их компиляция. */ \
|
2015-03-29 09:20:28 +00:00
|
|
|
|
M(SettingUInt64, min_count_to_compile, 3) \
|
2015-02-22 05:51:16 +00:00
|
|
|
|
/** При каком количестве ключей, начинает использоваться двухуровневая агрегация. 0 - никогда не использовать. */ \
|
2015-03-24 00:44:54 +00:00
|
|
|
|
M(SettingUInt64, group_by_two_level_threshold, 100000) \
|
2014-12-30 14:11:02 +00:00
|
|
|
|
\
|
|
|
|
|
/** Максимальное количество используемых реплик каждого шарда при выполнении запроса */ \
|
|
|
|
|
M(SettingUInt64, max_parallel_replicas, 1) \
|
|
|
|
|
M(SettingUInt64, parallel_replicas_count, 0) \
|
|
|
|
|
M(SettingUInt64, parallel_replica_offset, 0) \
|
2015-02-15 02:31:48 +00:00
|
|
|
|
\
|
|
|
|
|
/** Тонкие настройки для чтения из MergeTree */ \
|
|
|
|
|
\
|
|
|
|
|
/** Если из одного файла читается хотя бы столько строк, чтение можно распараллелить. */ \
|
|
|
|
|
M(SettingUInt64, merge_tree_min_rows_for_concurrent_read, (20 * 8192)) \
|
|
|
|
|
/** Можно пропускать чтение более чем стольки строк ценой одного seek по файлу. */ \
|
|
|
|
|
M(SettingUInt64, merge_tree_min_rows_for_seek, (5 * 8192)) \
|
|
|
|
|
/** Если отрезок индекса может содержать нужные ключи, делим его на столько частей и рекурсивно проверяем их. */ \
|
|
|
|
|
M(SettingUInt64, merge_tree_coarse_index_granularity, 8) \
|
|
|
|
|
/** Максимальное количество строк на запрос, для использования кэша разжатых данных. Если запрос большой - кэш не используется. \
|
|
|
|
|
* (Чтобы большие запросы не вымывали кэш.) */ \
|
|
|
|
|
M(SettingUInt64, merge_tree_max_rows_to_use_cache, (1024 * 1024)) \
|
2015-02-18 16:54:42 +00:00
|
|
|
|
\
|
|
|
|
|
/** Минимальная длина выражения expr = x1 OR ... expr = xN для оптимизации */ \
|
2015-03-02 05:42:02 +00:00
|
|
|
|
M(SettingUInt64, optimize_min_equality_disjunction_chain_length, 3) \
|
2015-03-05 14:59:29 +00:00
|
|
|
|
\
|
2015-04-16 11:47:17 +00:00
|
|
|
|
/** Минимальное количество байт для операций ввода/ввывода минуя кэш страниц. 0 - отключено. */ \
|
|
|
|
|
M(SettingUInt64, min_bytes_to_use_direct_io, 0) \
|
2015-03-14 01:20:10 +00:00
|
|
|
|
\
|
|
|
|
|
/** Кидать исключение, если есть индекс по дате, и он не используется. */ \
|
|
|
|
|
M(SettingBool, force_index_by_date, 0) \
|
2015-04-10 00:43:08 +00:00
|
|
|
|
\
|
|
|
|
|
/** В запросе INSERT с указанием столбцов, заполнять значения по-умолчанию только для столбцов с явными DEFAULT-ами. */ \
|
|
|
|
|
M(SettingBool, strict_insert_defaults, 0) \
|
2015-05-07 10:31:50 +00:00
|
|
|
|
\
|
|
|
|
|
/** В случае превышения максимального размера mark_cache, удалять только записи, старше чем mark_cache_min_lifetime секунд. */ \
|
|
|
|
|
M(SettingUInt64, mark_cache_min_lifetime, 10000) \
|
2015-05-11 00:11:22 +00:00
|
|
|
|
\
|
|
|
|
|
/** Позволяет использовать больше источников, чем количество потоков - для более равномерного распределения работы по потокам. \
|
|
|
|
|
* Предполагается, что это временное решение, так как можно будет в будущем сделать количество источников равное количеству потоков, \
|
|
|
|
|
* но чтобы каждый источник динамически выбирал себе доступную работу. \
|
|
|
|
|
*/ \
|
2015-05-12 05:01:43 +00:00
|
|
|
|
M(SettingFloat, max_streams_to_max_threads_ratio, 1) \
|
2015-05-21 09:38:02 +00:00
|
|
|
|
\
|
|
|
|
|
/** Позволяет выбирать метод сжатия данных при записи */\
|
2015-05-21 16:05:02 +00:00
|
|
|
|
M(SettingCompressionMethod, network_compression_method, CompressionMethod::LZ4) \
|
2015-06-21 06:06:04 +00:00
|
|
|
|
\
|
|
|
|
|
/** Приоритет запроса. 1 - самый высокий, больше - ниже; 0 - не использовать приоритеты. */ \
|
|
|
|
|
M(SettingUInt64, priority, 0) \
|
2015-06-26 20:48:10 +00:00
|
|
|
|
\
|
|
|
|
|
/** Логгировать запросы и писать лог в системную таблицу. */ \
|
|
|
|
|
M(SettingBool, log_queries, 0) \
|
2014-01-28 19:26:37 +00:00
|
|
|
|
|
2012-12-24 19:50:22 +00:00
|
|
|
|
/// Всевозможные ограничения на выполнение запроса.
|
|
|
|
|
Limits limits;
|
|
|
|
|
|
2014-02-17 23:56:45 +00:00
|
|
|
|
#define DECLARE(TYPE, NAME, DEFAULT) \
|
|
|
|
|
TYPE NAME {DEFAULT};
|
|
|
|
|
|
|
|
|
|
APPLY_FOR_SETTINGS(DECLARE)
|
|
|
|
|
|
|
|
|
|
#undef DECLARE
|
|
|
|
|
|
2012-08-02 19:03:32 +00:00
|
|
|
|
/// Установить настройку по имени.
|
2014-03-07 02:10:36 +00:00
|
|
|
|
void set(const String & name, const Field & value);
|
2013-02-01 19:02:04 +00:00
|
|
|
|
|
2013-02-17 19:54:32 +00:00
|
|
|
|
/// Установить настройку по имени. Прочитать сериализованное в бинарном виде значение из буфера (для межсерверного взаимодействия).
|
2014-03-07 02:10:36 +00:00
|
|
|
|
void set(const String & name, ReadBuffer & buf);
|
2014-02-17 23:56:45 +00:00
|
|
|
|
|
2015-02-27 20:35:26 +00:00
|
|
|
|
/// Пропустить сериализованное в бинарном виде значение из буфера.
|
|
|
|
|
void ignore(const String & name, ReadBuffer & buf);
|
|
|
|
|
|
2014-02-17 23:56:45 +00:00
|
|
|
|
/** Установить настройку по имени. Прочитать значение в текстовом виде из строки (например, из конфига, или из параметра URL).
|
|
|
|
|
*/
|
2014-03-07 02:10:36 +00:00
|
|
|
|
void set(const String & name, const String & value);
|
2013-02-17 19:54:32 +00:00
|
|
|
|
|
|
|
|
|
/** Установить настройки из профиля (в конфиге сервера, в одном профиле может быть перечислено много настроек).
|
|
|
|
|
* Профиль также может быть установлен с помощью функций set, как настройка profile.
|
|
|
|
|
*/
|
2014-03-07 02:10:36 +00:00
|
|
|
|
void setProfile(const String & profile_name, Poco::Util::AbstractConfiguration & config);
|
2013-02-17 19:54:32 +00:00
|
|
|
|
|
2013-02-01 19:02:04 +00:00
|
|
|
|
/// Прочитать настройки из буфера. Они записаны как набор name-value пар, идущих подряд, заканчивающихся пустым name.
|
2015-02-27 20:35:26 +00:00
|
|
|
|
/// Если в настройках выставлено readonly=1, то игнорировать настройки.
|
|
|
|
|
void deserialize(ReadBuffer & buf);
|
2014-02-17 23:56:45 +00:00
|
|
|
|
|
|
|
|
|
/// Записать изменённые настройки в буфер. (Например, для отправки на удалённый сервер.)
|
2014-03-07 02:10:36 +00:00
|
|
|
|
void serialize(WriteBuffer & buf) const;
|
2012-03-05 00:09:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|