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
{
2015-11-16 03:28:10 +00:00
/// Для того, чтобы инициализация из пустого initializer-list была value initialization, а не aggregate initialization в С ++14.
/// http://en.cppreference.com/w/cpp/language/aggregate_initialization
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 ) \
2016-07-01 21:02:13 +00:00
/** Squash blocks passed to INSERT query to specified size in rows, if blocks are not big enough. */ \
M ( SettingUInt64 , min_insert_block_size_rows , DEFAULT_INSERT_BLOCK_SIZE ) \
/** Squash blocks passed to INSERT query to specified size in bytes, if blocks are not big enough. */ \
M ( SettingUInt64 , min_insert_block_size_bytes , ( DEFAULT_INSERT_BLOCK_SIZE * 256 ) ) \
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 ) \
2016-04-09 05:43:55 +00:00
/** Ожидать выполнения действий по изменению структуры таблицы в течение указанного количества секунд. 0 - ждать неограниченное время. */ \
M ( SettingUInt64 , replication_alter_columns_timeout , 60 ) \
2014-10-18 19:14:09 +00:00
\
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
\
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-11-30 19:57:46 +00:00
/** При каком количестве ключей, начинает использоваться двухуровневая агрегация. 0 - порог не выставлен. */ \
2015-03-24 00:44:54 +00:00
M ( SettingUInt64 , group_by_two_level_threshold , 100000 ) \
2015-11-30 19:57:46 +00:00
/** При каком размере состояния агрегации в байтах, начинает использоваться двухуровневая агрегация. 0 - порог не выставлен. \
* Д в у х у р о в н е в а я а г р е г а ц и я н а ч и н а е т и с п о л ь з о в а т ь с я п р и с р а б а т ы в а н и и х о т я б ы о д н о г о и з п о р о г о в . */ \
M ( SettingUInt64 , group_by_two_level_threshold_bytes , 100000000 ) \
2015-07-30 23:41:02 +00:00
/** Включён ли экономный по памяти режим распределённой агрегации. */ \
M ( SettingBool , distributed_aggregation_memory_efficient , false ) \
2016-09-19 06:02:42 +00:00
/** Number of threads to use for merge intermediate aggregation results in memory efficient mode. When bigger, then more memory is consumed. \
* 0 means - same as ' max_threads ' . */ \
M ( SettingUInt64 , aggregation_memory_efficient_merge_threads , 0 ) \
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
\
2015-06-28 06:38:18 +00:00
/** Тихо пропускать недоступные шарды. */ \
M ( SettingBool , skip_unavailable_shards , false ) \
\
2015-06-28 06:48:42 +00:00
/** Н е мерджить состояния агрегации с разных серверов при распределённой обработке запроса \
* - н а с л у ч а й , к о г д а д о п о д л и н н о и з в е с т н о , ч т о н а р а з н ы х ш а р д а х р а з н ы е к л ю ч и . \
*/ \
M ( SettingBool , distributed_group_by_no_merge , false ) \
\
2015-02-15 02:31:48 +00:00
/** Тонкие настройки для чтения из MergeTree */ \
\
/** Если из одного файла читается хотя бы столько строк, чтение можно распараллелить. */ \
M ( SettingUInt64 , merge_tree_min_rows_for_concurrent_read , ( 20 * 8192 ) ) \
/** Можно пропускать чтение более чем стольки строк ценой одного seek по файлу. */ \
2016-03-27 12:52:13 +00:00
M ( SettingUInt64 , merge_tree_min_rows_for_seek , 0 ) \
2015-02-15 02:31:48 +00:00
/** Если отрезок индекса может содержать нужные ключи, делим е г о на столько частей и рекурсивно проверяем их. */ \
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
\
2015-09-01 16:09:12 +00:00
/** Распределять чтение из MergeTree по потокам равномерно, обеспечивая стабильное среднее время исполнения каждого потока в пределах одного чтения. */ \
2015-10-08 00:09:48 +00:00
M ( SettingBool , merge_tree_uniform_read_distribution , true ) \
2015-06-24 12:21:43 +00:00
\
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
\
2015-11-29 08:06:29 +00:00
/** Кидать исключение, если есть индекс, и он не используется. */ \
2015-03-14 01:20:10 +00:00
M ( SettingBool , force_index_by_date , 0 ) \
2015-11-29 08:06:29 +00:00
M ( SettingBool , force_primary_key , 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 ) \
2015-09-04 21:39:10 +00:00
\
2016-06-25 03:21:01 +00:00
/** If query length is greater than specified threshold (in bytes), then cut query when writing to query log. \
* Also limit length of printed query in ordinary text log . \
*/ \
M ( SettingUInt64 , log_queries_cut_to_length , 100000 ) \
\
2015-09-18 13:36:10 +00:00
/** Как выполняются распределённые подзапросы внутри секций IN или JOIN? */ \
M ( SettingDistributedProductMode , distributed_product_mode , DistributedProductMode : : DENY ) \
\
2015-09-04 21:39:10 +00:00
/** Схема выполнения GLOBAL-подзапросов. */ \
M ( SettingGlobalSubqueriesMethod , global_subqueries_method , GlobalSubqueriesMethod : : PUSH ) \
2015-09-08 21:01:43 +00:00
\
/** Максимальное количество одновременно выполняющихся запросов на одного user-а . */ \
M ( SettingUInt64 , max_concurrent_queries_for_user , 0 ) \
2015-09-09 18:15:36 +00:00
\
/** Для запросов INSERT в реплицируемую таблицу, ждать записи на указанное число реплик и лианеризовать добавление данных. 0 - отключено. */ \
M ( SettingUInt64 , insert_quorum , 0 ) \
2016-01-24 05:00:24 +00:00
M ( SettingMilliseconds , insert_quorum_timeout , 600000 ) \
2015-09-20 11:54:58 +00:00
/** Для запросов SELECT из реплицируемой таблицы, кидать исключение, если на реплике нет куска, записанного с кворумом; \
* н е ч и т а т ь к у с к и , к о т о р ы е е щ ё н е б ы л и з а п и с а н ы с к в о р у м о м . */ \
M ( SettingUInt64 , select_sequential_consistency , 0 ) \
2015-10-16 15:36:23 +00:00
/** Максимальное количество различных шардов и максимальное количество реплик одного шарда в функции remote. */ \
M ( SettingUInt64 , table_function_remote_max_addresses , 1000 ) \
2015-12-13 04:52:13 +00:00
/** Маскимальное количество потоков при распределённой обработке одного запроса */ \
2015-11-06 17:44:01 +00:00
M ( SettingUInt64 , max_distributed_processing_threads , 8 ) \
2015-12-13 04:52:13 +00:00
\
/** Настройки понижения числа потоков в случае медленных чтений. */ \
/** Обращать внимания только на чтения, занявшие не меньше такого количества времени. */ \
M ( SettingMilliseconds , read_backoff_min_latency_ms , 1000 ) \
/** Считать события, когда пропускная способность меньше стольки байт в секунду. */ \
M ( SettingUInt64 , read_backoff_max_throughput , 1048576 ) \
/** Н е обращать внимания на событие, если от предыдущего прошло меньше стольки-то времени. */ \
M ( SettingMilliseconds , read_backoff_min_interval_between_events_ms , 1000 ) \
/** Количество событий, после которого количество потоков будет уменьшено. */ \
M ( SettingUInt64 , read_backoff_min_events , 2 ) \
2015-12-23 07:39:28 +00:00
\
/** В целях тестирования exception safety - кидать исключение при каждом выделении памяти с указанной вероятностью. */ \
M ( SettingFloat , memory_tracker_fault_probability , 0. ) \
2016-02-12 02:26:04 +00:00
\
2016-02-19 19:02:20 +00:00
/** Сжимать результат, если клиент по HTTP сказал, что он понимает данные, сжатые методом gzip или deflate */ \
M ( SettingBool , enable_http_compression , 0 ) \
2016-02-12 02:26:04 +00:00
/** Уровень сжатия - используется, если клиент по HTTP сказал, что он понимает данные, сжатые методом gzip или deflate */ \
M ( SettingInt64 , http_zlib_compression_level , 3 ) \
2016-04-09 23:24:38 +00:00
\
/** При разжатии данных POST от клиента, сжатых родным форматом, не проверять чексуммы */ \
M ( SettingBool , http_native_compression_disable_checksumming_on_decompress , 0 ) \
\
2016-03-01 17:47:53 +00:00
/** Таймаут в секундах */ \
2016-03-08 15:38:06 +00:00
M ( SettingUInt64 , resharding_barrier_timeout , 300 ) \
2016-07-10 15:52:35 +00:00
\
/** What aggregate function to use for implementation of count(DISTINCT ...) */ \
M ( SettingString , count_distinct_implementation , " uniq " ) \
2016-08-17 20:03:22 +00:00
\
/** Write statistics about read rows, bytes, time elapsed in suitable output formats */ \
M ( SettingBool , output_format_write_statistics , true ) \
2016-08-23 18:35:23 +00:00
\
/** Write add http CORS header */ \
M ( SettingBool , add_http_cors_header , false ) \
2016-09-20 19:11:25 +00:00
\
/** Skip columns with unknown names from input data (it works for JSONEachRow and TSKV formats). */ \
2016-09-30 16:02:16 +00:00
M ( SettingBool , input_format_skip_unknown_fields , false ) \
\
/** Controls quoting of 64-bit integers in JSON output format. */ \
M ( SettingBool , output_format_json_quote_64bit_integers , true )
2016-09-19 06:02:42 +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
2015-09-09 11:39:24 +00:00
/// Загрузить настройки по пути из конфига
2016-01-27 07:03:15 +00:00
void loadSettingsFromConfig ( const String & path , const Poco : : Util : : AbstractConfiguration & config ) ;
2015-09-09 11:39:24 +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
} ;
}