mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-28 10:31:57 +00:00
Merge branch 'master' into sorting-processors
This commit is contained in:
commit
153f795ebe
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -13,7 +13,7 @@
|
||||
url = https://github.com/edenhill/librdkafka.git
|
||||
[submodule "contrib/cctz"]
|
||||
path = contrib/cctz
|
||||
url = https://github.com/google/cctz.git
|
||||
url = https://github.com/ClickHouse-Extras/cctz.git
|
||||
[submodule "contrib/zlib-ng"]
|
||||
path = contrib/zlib-ng
|
||||
url = https://github.com/ClickHouse-Extras/zlib-ng.git
|
||||
|
18
CHANGELOG.md
18
CHANGELOG.md
@ -1,5 +1,23 @@
|
||||
## ClickHouse release v20.3
|
||||
|
||||
### ClickHouse release v20.3.5.21, 2020-03-27
|
||||
|
||||
#### Bug Fix
|
||||
|
||||
* Fix 'Different expressions with the same alias' error when query has PREWHERE and WHERE on distributed table and `SET distributed_product_mode = 'local'`. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)).
|
||||
* Fix mutations excessive memory consumption for tables with a composite primary key. This fixes [#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)).
|
||||
* Fix 'COMMA to CROSS JOIN rewriter is not enabled or cannot rewrite query' error in case of subqueries with COMMA JOIN out of tables lists (i.e. in WHERE). Fixes [#9782](https://github.com/ClickHouse/ClickHouse/issues/9782). [#9830](https://github.com/ClickHouse/ClickHouse/pull/9830) ([Artem Zuikov](https://github.com/4ertus2)).
|
||||
* Fix possible exception `Got 0 in totals chunk, expected 1` on client. It happened for queries with `JOIN` in case if right joined table had zero rows. Example: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. Fixes [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||
* Fix SIGSEGV with optimize_skip_unused_shards when type cannot be converted. [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)).
|
||||
* Fix broken `ALTER TABLE DELETE COLUMN` query for compact parts. [#9779](https://github.com/ClickHouse/ClickHouse/pull/9779) ([alesapin](https://github.com/alesapin)).
|
||||
* Fix max_distributed_connections (w/ and w/o Processors). [#9673](https://github.com/ClickHouse/ClickHouse/pull/9673) ([Azat Khuzhin](https://github.com/azat)).
|
||||
* Fixed a few cases when timezone of the function argument wasn't used properly. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)).
|
||||
|
||||
#### Improvement
|
||||
|
||||
* Remove order by stage from mutations because we read from a single ordered part in a single thread. Also add check that the order of rows in mutation is ordered in sorting key order and this order is not violated. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)).
|
||||
|
||||
|
||||
### ClickHouse release v20.3.4.10, 2020-03-20
|
||||
|
||||
#### Bug Fix
|
||||
|
@ -133,7 +133,10 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_)
|
||||
}
|
||||
|
||||
/// Fill lookup table for years and months.
|
||||
for (size_t day = 0; day < DATE_LUT_SIZE && lut[day].year <= DATE_LUT_MAX_YEAR; ++day)
|
||||
size_t year_months_lut_index = 0;
|
||||
size_t first_day_of_last_month = 0;
|
||||
|
||||
for (size_t day = 0; day < DATE_LUT_SIZE; ++day)
|
||||
{
|
||||
const Values & values = lut[day];
|
||||
|
||||
@ -141,7 +144,16 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_)
|
||||
{
|
||||
if (values.month == 1)
|
||||
years_lut[values.year - DATE_LUT_MIN_YEAR] = day;
|
||||
years_months_lut[(values.year - DATE_LUT_MIN_YEAR) * 12 + values.month - 1] = day;
|
||||
|
||||
year_months_lut_index = (values.year - DATE_LUT_MIN_YEAR) * 12 + values.month - 1;
|
||||
years_months_lut[year_months_lut_index] = day;
|
||||
first_day_of_last_month = day;
|
||||
}
|
||||
}
|
||||
|
||||
/// Fill the rest of lookup table with the same last month (2106-02-01).
|
||||
for (; year_months_lut_index < DATE_LUT_YEARS * 12; ++year_months_lut_index)
|
||||
{
|
||||
years_months_lut[year_months_lut_index] = first_day_of_last_month;
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
/// Table size is bigger than DATE_LUT_MAX_DAY_NUM to fill all indices within UInt16 range: this allows to remove extra check.
|
||||
#define DATE_LUT_SIZE 0x10000
|
||||
#define DATE_LUT_MIN_YEAR 1970
|
||||
#define DATE_LUT_MAX_YEAR 2105 /// Last supported year
|
||||
#define DATE_LUT_MAX_YEAR 2106 /// Last supported year (incomplete)
|
||||
#define DATE_LUT_YEARS (1 + DATE_LUT_MAX_YEAR - DATE_LUT_MIN_YEAR) /// Number of years in lookup table
|
||||
|
||||
#if defined(__PPC__)
|
||||
|
@ -1,2 +1,17 @@
|
||||
set(MSGPACK_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/msgpack-c/include)
|
||||
option (USE_INTERNAL_MSGPACK_LIBRARY "Set to FALSE to use system msgpack library instead of bundled" ${NOT_UNBUNDLED})
|
||||
|
||||
if (USE_INTERNAL_MSGPACK_LIBRARY)
|
||||
if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/msgpack-c/include/msgpack.hpp")
|
||||
message(WARNING "Submodule contrib/msgpack-c is missing. To fix try run: \n git submodule update --init --recursive")
|
||||
set(USE_INTERNAL_MSGPACK_LIBRARY 0)
|
||||
set(MISSING_INTERNAL_MSGPACK_LIBRARY 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (USE_INTERNAL_MSGPACK_LIBRARY)
|
||||
set(MSGPACK_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/msgpack-c/include)
|
||||
else()
|
||||
find_path(MSGPACK_INCLUDE_DIR NAMES msgpack.hpp PATHS ${MSGPACK_INCLUDE_PATHS})
|
||||
endif()
|
||||
|
||||
message(STATUS "Using msgpack: ${MSGPACK_INCLUDE_DIR}")
|
||||
|
@ -6,18 +6,18 @@ endif ()
|
||||
|
||||
if (COMPILER_GCC)
|
||||
# Require minimum version of gcc
|
||||
set (GCC_MINIMUM_VERSION 8)
|
||||
set (GCC_MINIMUM_VERSION 9)
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${GCC_MINIMUM_VERSION} AND NOT CMAKE_VERSION VERSION_LESS 2.8.9)
|
||||
message (FATAL_ERROR "GCC version must be at least ${GCC_MINIMUM_VERSION}. For example, if GCC ${GCC_MINIMUM_VERSION} is available under gcc-${GCC_MINIMUM_VERSION}, g++-${GCC_MINIMUM_VERSION} names, do the following: export CC=gcc-${GCC_MINIMUM_VERSION} CXX=g++-${GCC_MINIMUM_VERSION}; rm -rf CMakeCache.txt CMakeFiles; and re run cmake or ./release.")
|
||||
endif ()
|
||||
elseif (COMPILER_CLANG)
|
||||
# Require minimum version of clang
|
||||
set (CLANG_MINIMUM_VERSION 7)
|
||||
set (CLANG_MINIMUM_VERSION 8)
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${CLANG_MINIMUM_VERSION})
|
||||
message (FATAL_ERROR "Clang version must be at least ${CLANG_MINIMUM_VERSION}.")
|
||||
endif ()
|
||||
else ()
|
||||
message (WARNING "You are using an unsupported compiler. Compilation has only been tested with Clang 6+ and GCC 7+.")
|
||||
message (WARNING "You are using an unsupported compiler. Compilation has only been tested with Clang and GCC.")
|
||||
endif ()
|
||||
|
||||
STRING(REGEX MATCHALL "[0-9]+" COMPILER_VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION})
|
||||
|
2
contrib/cctz
vendored
2
contrib/cctz
vendored
@ -1 +1 @@
|
||||
Subproject commit 4f9776a310f4952454636363def82c2bf6641d5f
|
||||
Subproject commit 5a3f785329cecdd2b68cd950e0647e9246774ef2
|
2
contrib/libc-headers
vendored
2
contrib/libc-headers
vendored
@ -1 +1 @@
|
||||
Subproject commit 9676d2645a713e679dc981ffd84dee99fcd68b8e
|
||||
Subproject commit 92c74f938cf2c4dd529cae4f3d2923d153b029a7
|
File diff suppressed because it is too large
Load Diff
@ -124,11 +124,9 @@ namespace pdqsort_detail {
|
||||
inline bool partial_insertion_sort(Iter begin, Iter end, Compare comp) {
|
||||
typedef typename std::iterator_traits<Iter>::value_type T;
|
||||
if (begin == end) return true;
|
||||
|
||||
int limit = 0;
|
||||
for (Iter cur = begin + 1; cur != end; ++cur) {
|
||||
if (limit > partial_insertion_sort_limit) return false;
|
||||
|
||||
std::size_t limit = 0;
|
||||
for (Iter cur = begin + 1; cur != end; ++cur) {
|
||||
Iter sift = cur;
|
||||
Iter sift_1 = cur - 1;
|
||||
|
||||
@ -142,6 +140,8 @@ namespace pdqsort_detail {
|
||||
*sift = PDQSORT_PREFER_MOVE(tmp);
|
||||
limit += cur - sift;
|
||||
}
|
||||
|
||||
if (limit > partial_insertion_sort_limit) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -232,7 +232,7 @@ namespace pdqsort_detail {
|
||||
unsigned char* offsets_r = align_cacheline(offsets_r_storage);
|
||||
int num_l, num_r, start_l, start_r;
|
||||
num_l = num_r = start_l = start_r = 0;
|
||||
|
||||
|
||||
while (last - first > 2 * block_size) {
|
||||
// Fill up offset blocks with elements that are on the wrong side.
|
||||
if (num_l == 0) {
|
||||
@ -275,7 +275,7 @@ namespace pdqsort_detail {
|
||||
}
|
||||
|
||||
int l_size = 0, r_size = 0;
|
||||
int unknown_left = (last - first) - ((num_r || num_l) ? block_size : 0);
|
||||
int unknown_left = (int)(last - first) - ((num_r || num_l) ? block_size : 0);
|
||||
if (num_r) {
|
||||
// Handle leftover block by assigning the unknown elements to the other block.
|
||||
l_size = unknown_left;
|
||||
@ -311,7 +311,7 @@ namespace pdqsort_detail {
|
||||
start_l += num; start_r += num;
|
||||
if (num_l == 0) first += l_size;
|
||||
if (num_r == 0) last -= r_size;
|
||||
|
||||
|
||||
// We have now fully identified [first, last)'s proper position. Swap the last elements.
|
||||
if (num_l) {
|
||||
offsets_l += start_l;
|
||||
@ -340,7 +340,7 @@ namespace pdqsort_detail {
|
||||
template<class Iter, class Compare>
|
||||
inline std::pair<Iter, bool> partition_right(Iter begin, Iter end, Compare comp) {
|
||||
typedef typename std::iterator_traits<Iter>::value_type T;
|
||||
|
||||
|
||||
// Move pivot into local for speed.
|
||||
T pivot(PDQSORT_PREFER_MOVE(*begin));
|
||||
|
||||
@ -359,7 +359,7 @@ namespace pdqsort_detail {
|
||||
// If the first pair of elements that should be swapped to partition are the same element,
|
||||
// the passed in sequence already was correctly partitioned.
|
||||
bool already_partitioned = first >= last;
|
||||
|
||||
|
||||
// Keep swapping pairs of elements that are on the wrong side of the pivot. Previously
|
||||
// swapped pairs guard the searches, which is why the first iteration is special-cased
|
||||
// above.
|
||||
@ -388,7 +388,7 @@ namespace pdqsort_detail {
|
||||
T pivot(PDQSORT_PREFER_MOVE(*begin));
|
||||
Iter first = begin;
|
||||
Iter last = end;
|
||||
|
||||
|
||||
while (comp(pivot, *--last));
|
||||
|
||||
if (last + 1 == end) while (first < last && !comp(pivot, *++first));
|
||||
@ -475,11 +475,11 @@ namespace pdqsort_detail {
|
||||
std::iter_swap(pivot_pos - 3, pivot_pos - (l_size / 4 + 2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (r_size >= insertion_sort_threshold) {
|
||||
std::iter_swap(pivot_pos + 1, pivot_pos + (1 + r_size / 4));
|
||||
std::iter_swap(end - 1, end - r_size / 4);
|
||||
|
||||
|
||||
if (r_size > ninther_threshold) {
|
||||
std::iter_swap(pivot_pos + 2, pivot_pos + (2 + r_size / 4));
|
||||
std::iter_swap(pivot_pos + 3, pivot_pos + (3 + r_size / 4));
|
||||
@ -493,7 +493,7 @@ namespace pdqsort_detail {
|
||||
if (already_partitioned && partial_insertion_sort(begin, pivot_pos, comp)
|
||||
&& partial_insertion_sort(pivot_pos + 1, end, comp)) return;
|
||||
}
|
||||
|
||||
|
||||
// Sort the left partition first using recursion and do tail recursion elimination for
|
||||
// the right-hand partition.
|
||||
pdqsort_loop<Iter, Compare, Branchless>(begin, pivot_pos, comp, bad_allowed, leftmost);
|
||||
|
@ -48,6 +48,7 @@ RUN apt-get --allow-unauthenticated update -y \
|
||||
libltdl-dev \
|
||||
libre2-dev \
|
||||
libjemalloc-dev \
|
||||
libmsgpack-dev \
|
||||
unixodbc-dev \
|
||||
odbcinst \
|
||||
tzdata \
|
||||
|
@ -42,9 +42,11 @@ function configure
|
||||
rm db0/metadata/system/* -rf ||:
|
||||
|
||||
# Make copies of the original db for both servers. Use hardlinks instead
|
||||
# of copying.
|
||||
# of copying. Be careful to remove preprocessed configs or it can lead to
|
||||
# weird effects.
|
||||
rm -r left/db ||:
|
||||
rm -r right/db ||:
|
||||
rm -r db0/preprocessed_configs ||:
|
||||
cp -al db0/ left/db/
|
||||
cp -al db0/ right/db/
|
||||
}
|
||||
|
@ -70,6 +70,7 @@ CMD dpkg -i package_folder/clickhouse-common-static_*.deb; \
|
||||
ln -s /usr/share/clickhouse-test/config/disks.xml /etc/clickhouse-server/config.d/; \
|
||||
ln -s /usr/share/clickhouse-test/config/secure_ports.xml /etc/clickhouse-server/config.d/; \
|
||||
ln -s /usr/share/clickhouse-test/config/clusters.xml /etc/clickhouse-server/config.d/; \
|
||||
ln -s /usr/share/clickhouse-test/config/graphite.xml /etc/clickhouse-server/config.d/; \
|
||||
ln -s /usr/share/clickhouse-test/config/server.key /etc/clickhouse-server/; \
|
||||
ln -s /usr/share/clickhouse-test/config/server.crt /etc/clickhouse-server/; \
|
||||
ln -s /usr/share/clickhouse-test/config/dhparam.pem /etc/clickhouse-server/; \
|
||||
|
@ -5,7 +5,7 @@ toc_title: Browse ClickHouse Source Code
|
||||
|
||||
# Browse ClickHouse Source Code {#browse-clickhouse-source-code}
|
||||
|
||||
You can use **Woboq** online code browser available [here](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/src/index.html). It provides code navigation and semantic highlighting, search and indexing. The code snapshot is updated daily.
|
||||
You can use **Woboq** online code browser available [here](https://clickhouse.tech/codebrowser/html_report///ClickHouse/src/index.html). It provides code navigation and semantic highlighting, search and indexing. The code snapshot is updated daily.
|
||||
|
||||
Also, you can browse sources on [GitHub](https://github.com/ClickHouse/ClickHouse) as usual.
|
||||
|
||||
|
@ -15,7 +15,7 @@ Tests are located in `queries` directory. There are two subdirectories: `statele
|
||||
|
||||
Each test can be one of two types: `.sql` and `.sh`. `.sql` test is the simple SQL script that is piped to `clickhouse-client --multiquery --testmode`. `.sh` test is a script that is run by itself.
|
||||
|
||||
To run all tests, use `testskhouse-test` tool. Look `--help` for the list of possible options. You can simply run all tests or run subset of tests filtered by substring in test name: `./clickhouse-test substring`.
|
||||
To run all tests, use `clickhouse-test` tool. Look `--help` for the list of possible options. You can simply run all tests or run subset of tests filtered by substring in test name: `./clickhouse-test substring`.
|
||||
|
||||
The most simple way to invoke functional tests is to copy `clickhouse-client` to `/usr/bin/`, run `clickhouse-server` and then run `./clickhouse-test` from its own directory.
|
||||
|
||||
@ -34,13 +34,13 @@ disable these groups of tests using `--no-zookeeper`, `--no-shard` and
|
||||
|
||||
## Known Bugs {#known-bugs}
|
||||
|
||||
If we know some bugs that can be easily reproduced by functional tests, we place prepared functional tests in `queries/bugs` directory. These tests will be moved to `teststests_stateless` when bugs are fixed.
|
||||
If we know some bugs that can be easily reproduced by functional tests, we place prepared functional tests in `tests/queries/bugs` directory. These tests will be moved to `tests/queries/0_stateless` when bugs are fixed.
|
||||
|
||||
## Integration Tests {#integration-tests}
|
||||
|
||||
Integration tests allow to test ClickHouse in clustered configuration and ClickHouse interaction with other servers like MySQL, Postgres, MongoDB. They are useful to emulate network splits, packet drops, etc. These tests are run under Docker and create multiple containers with various software.
|
||||
|
||||
See `testsgration/README.md` on how to run these tests.
|
||||
See `tests/integration/README.md` on how to run these tests.
|
||||
|
||||
Note that integration of ClickHouse with third-party drivers is not tested. Also we currently don’t have integration tests with our JDBC and ODBC drivers.
|
||||
|
||||
@ -54,7 +54,7 @@ It’s not necessarily to have unit tests if the code is already covered by func
|
||||
|
||||
Performance tests allow to measure and compare performance of some isolated part of ClickHouse on synthetic queries. Tests are located at `tests/performance`. Each test is represented by `.xml` file with description of test case. Tests are run with `clickhouse performance-test` tool (that is embedded in `clickhouse` binary). See `--help` for invocation.
|
||||
|
||||
Each test run one or miltiple queries (possibly with combinations of parameters) in a loop with some conditions for stop (like “maximum execution speed is not changing in three seconds”) and measure some metrics about query performance (like “maximum execution speed”). Some tests can contain preconditions on preloaded test dataset.
|
||||
Each test run one or multiple queries (possibly with combinations of parameters) in a loop with some conditions for stop (like “maximum execution speed is not changing in three seconds”) and measure some metrics about query performance (like “maximum execution speed”). Some tests can contain preconditions on preloaded test dataset.
|
||||
|
||||
If you want to improve performance of ClickHouse in some scenario, and if improvements can be observed on simple queries, it is highly recommended to write a performance test. It always makes sense to use `perf top` or other perf tools during your tests.
|
||||
|
||||
@ -64,13 +64,13 @@ Some programs in `tests` directory are not prepared tests, but are test tools. F
|
||||
|
||||
You can also place pair of files `.sh` and `.reference` along with the tool to run it on some predefined input - then script result can be compared to `.reference` file. These kind of tests are not automated.
|
||||
|
||||
## Miscellanous Tests {#miscellanous-tests}
|
||||
## Miscellaneous Tests {#miscellaneous-tests}
|
||||
|
||||
There are tests for external dictionaries located at `tests/external_dictionaries` and for machine learned models in `tests/external_models`. These tests are not updated and must be transferred to integration tests.
|
||||
|
||||
There is separate test for quorum inserts. This test run ClickHouse cluster on separate servers and emulate various failure cases: network split, packet drop (between ClickHouse nodes, between ClickHouse and ZooKeeper, between ClickHouse server and client, etc.), `kill -9`, `kill -STOP` and `kill -CONT` , like [Jepsen](https://aphyr.com/tags/Jepsen). Then the test checks that all acknowledged inserts was written and all rejected inserts was not.
|
||||
|
||||
Quorum test was written by separate team before ClickHouse was open-sourced. This team no longer work with ClickHouse. Test was accidentially written in Java. For these reasons, quorum test must be rewritten and moved to integration tests.
|
||||
Quorum test was written by separate team before ClickHouse was open-sourced. This team no longer work with ClickHouse. Test was accidentally written in Java. For these reasons, quorum test must be rewritten and moved to integration tests.
|
||||
|
||||
## Manual Testing {#manual-testing}
|
||||
|
||||
|
@ -108,7 +108,7 @@ Syntax for creating tables is way more complicated compared to databases (see [r
|
||||
|
||||
1. Name of table to create.
|
||||
2. Table schema, i.e. list of columns and their [data types](../sql_reference/data_types/index.md).
|
||||
3. [Table engine](../engines/table_engines/index.md) and it’s settings, which determines all the details on how queries to this table will be physically executed.
|
||||
3. [Table engine](../engines/table_engines/index.md) and its settings, which determines all the details on how queries to this table will be physically executed.
|
||||
|
||||
Yandex.Metrica is a web analytics service, and sample dataset doesn’t cover its full functionality, so there are only two tables to create:
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
toc_priority: 3
|
||||
toc_priority: 0
|
||||
toc_title: Overview
|
||||
---
|
||||
|
||||
|
@ -76,5 +76,6 @@ toc_title: Adopters
|
||||
| [ЦВТ](https://htc-cs.ru/) | Software Development | Metrics, Logging | — | — | [Blog Post, March 2019, in Russian](https://vc.ru/dev/62715-kak-my-stroili-monitoring-na-prometheus-clickhouse-i-elk) |
|
||||
| [МКБ](https://mkb.ru/) | Bank | Web-system monitoring | — | — | [Slides in Russian, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/mkb.pdf) |
|
||||
| [金数据](https://jinshuju.net) | BI Analytics | Main product | — | — | [Slides in Chinese, October 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/3.%20金数据数据架构调整方案Public.pdf) |
|
||||
| [Instana](https://www.instana.com) | APM Platform | Main product | — | — | [Twitter post](https://twitter.com/mieldonkers/status/1248884119158882304) |
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/introduction/adopters/) <!--hide-->
|
||||
|
@ -66,4 +66,10 @@ ClickHouse uses asynchronous multi-master replication. After being written to an
|
||||
|
||||
For more information, see the section [Data replication](../engines/table_engines/mergetree_family/replication.md).
|
||||
|
||||
## Features that Can Be Considered Disadvantages {#clickhouse-features-that-can-be-considered-disadvantages}
|
||||
|
||||
1. No full-fledged transactions.
|
||||
2. Lack of ability to modify or delete already inserted data with high rate and low latency. There are batch deletes and updates available to clean up or modify data, for example to comply with [GDPR](https://gdpr-info.eu).
|
||||
3. The sparse index makes ClickHouse not so suitable for point queries retrieving single rows by their keys.
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/introduction/distinctive_features/) <!--hide-->
|
||||
|
@ -1,12 +0,0 @@
|
||||
---
|
||||
toc_priority: 5
|
||||
toc_title: ClickHouse Features that Can Be Considered Disadvantages
|
||||
---
|
||||
|
||||
# ClickHouse Features that Can Be Considered Disadvantages {#clickhouse-features-that-can-be-considered-disadvantages}
|
||||
|
||||
1. No full-fledged transactions.
|
||||
2. Lack of ability to modify or delete already inserted data with high rate and low latency. There are batch deletes and updates available to clean up or modify data, for example to comply with [GDPR](https://gdpr-info.eu).
|
||||
3. The sparse index makes ClickHouse not so suitable for point queries retrieving single rows by their keys.
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/introduction/features_considered_disadvantages/) <!--hide-->
|
@ -37,6 +37,8 @@ You can find metrics in the [system.metrics](../operations/system_tables.md#syst
|
||||
|
||||
You can configure ClickHouse to export metrics to [Graphite](https://github.com/graphite-project). See the [Graphite section](server_configuration_parameters/settings.md#server_configuration_parameters-graphite) in the ClickHouse server configuration file. Before configuring export of metrics, you should set up Graphite by following their official [guide](https://graphite.readthedocs.io/en/latest/install.html).
|
||||
|
||||
You can configure ClickHouse to export metrics to [Prometheus](https://prometheus.io). See the [Prometheus section](server_configuration_parameters/settings.md#server_configuration_parameters-prometheus) in the ClickHouse server configuration file. Before configuring export of metrics, you should set up Prometheus by following their official [guide](https://prometheus.io/docs/prometheus/latest/installation/).
|
||||
|
||||
Additionally, you can monitor server availability through the HTTP API. Send the `HTTP GET` request to `/ping`. If the server is available, it responds with `200 OK`.
|
||||
|
||||
To monitor servers in a cluster configuration, you should set the [max\_replica\_delay\_for\_distributed\_queries](settings/settings.md#settings-max_replica_delay_for_distributed_queries) parameter and use the HTTP resource `/replicas_status`. A request to `/replicas_status` returns `200 OK` if the replica is available and is not delayed behind the other replicas. If a replica is delayed, it returns `503 HTTP_SERVICE_UNAVAILABLE` with information about the gap.
|
||||
|
@ -24,7 +24,7 @@ With this instruction you can run basic ClickHouse performance test on any serve
|
||||
# Then do:
|
||||
chmod a+x clickhouse
|
||||
|
||||
1. Download configs:
|
||||
5. Download configs:
|
||||
|
||||
<!-- -->
|
||||
|
||||
@ -34,7 +34,7 @@ With this instruction you can run basic ClickHouse performance test on any serve
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/programs/server/config.d/path.xml -O config.d/path.xml
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/programs/server/config.d/log_to_console.xml -O config.d/log_to_console.xml
|
||||
|
||||
1. Download benchmark files:
|
||||
6. Download benchmark files:
|
||||
|
||||
<!-- -->
|
||||
|
||||
@ -42,7 +42,7 @@ With this instruction you can run basic ClickHouse performance test on any serve
|
||||
chmod a+x benchmark-new.sh
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/benchmark/clickhouse/queries.sql
|
||||
|
||||
1. Download test data according to the [Yandex.Metrica dataset](../getting_started/example_datasets/metrica.md) instruction (“hits” table containing 100 million rows).
|
||||
7. Download test data according to the [Yandex.Metrica dataset](../getting_started/example_datasets/metrica.md) instruction (“hits” table containing 100 million rows).
|
||||
|
||||
<!-- -->
|
||||
|
||||
@ -50,31 +50,31 @@ With this instruction you can run basic ClickHouse performance test on any serve
|
||||
tar xvf hits_100m_obfuscated_v1.tar.xz -C .
|
||||
mv hits_100m_obfuscated_v1/* .
|
||||
|
||||
1. Run the server:
|
||||
8. Run the server:
|
||||
|
||||
<!-- -->
|
||||
|
||||
./clickhouse server
|
||||
|
||||
1. Check the data: ssh to the server in another terminal
|
||||
9. Check the data: ssh to the server in another terminal
|
||||
|
||||
<!-- -->
|
||||
|
||||
./clickhouse client --query "SELECT count() FROM hits_100m_obfuscated"
|
||||
100000000
|
||||
|
||||
1. Edit the benchmark-new.sh, change “clickhouse-client” to “./clickhouse client” and add “–max\_memory\_usage 100000000000” parameter.
|
||||
10. Edit the benchmark-new.sh, change `clickhouse-client` to `./clickhouse client` and add `–-max_memory_usage 100000000000` parameter.
|
||||
|
||||
<!-- -->
|
||||
|
||||
mcedit benchmark-new.sh
|
||||
|
||||
1. Run the benchmark:
|
||||
11. Run the benchmark:
|
||||
|
||||
<!-- -->
|
||||
|
||||
./benchmark-new.sh hits_100m_obfuscated
|
||||
|
||||
1. Send the numbers and the info about your hardware configuration to clickhouse-feedback@yandex-team.com
|
||||
12. Send the numbers and the info about your hardware configuration to clickhouse-feedback@yandex-team.com
|
||||
|
||||
All the results are published here: https://clickhouse.tech/benchmark\_hardware.html
|
||||
All the results are published here: https://clickhouse.tech/benchmark_hardware.html
|
||||
|
@ -536,6 +536,30 @@ The path to the directory containing data.
|
||||
<path>/var/lib/clickhouse/</path>
|
||||
```
|
||||
|
||||
## prometheus {#server_configuration_parameters-prometheus}
|
||||
|
||||
Exposing metrics data for scraping from [Prometheus](https://prometheus.io).
|
||||
|
||||
Settings:
|
||||
|
||||
- `endpoint` – HTTP endpoint for scraping metrics by prometheus server. Start from '/'.
|
||||
- `port` – Port for `endpoint`.
|
||||
- `metrics` – Flag that sets to expose metrics from the [system.metrics](../system_tables.md#system_tables-metrics) table.
|
||||
- `events` – Flag that sets to expose metrics from the [system.events](../system_tables.md#system_tables-events) table.
|
||||
- `asynchronous_metrics` – Flag that sets to expose current metrics values from the [system.asynchronous\_metrics](../system_tables.md#system_tables-asynchronous_metrics) table.
|
||||
|
||||
**Example**
|
||||
|
||||
``` xml
|
||||
<prometheus>
|
||||
<endpoint>/metrics</endpoint>
|
||||
<port>8001</port>
|
||||
<metrics>true</metrics>
|
||||
<events>true</events>
|
||||
<asynchronous_metrics>true</asynchronous_metrics>
|
||||
</prometheus>
|
||||
```
|
||||
|
||||
## query\_log {#server_configuration_parameters-query-log}
|
||||
|
||||
Setting for logging queries received with the [log\_queries=1](../settings/settings.md) setting.
|
||||
|
@ -220,21 +220,28 @@ Ok.
|
||||
|
||||
## input\_format\_values\_deduce\_templates\_of\_expressions {#settings-input_format_values_deduce_templates_of_expressions}
|
||||
|
||||
Enables or disables template deduction for an SQL expressions in [Values](../../interfaces/formats.md#data-format-values) format. It allows to parse and interpret expressions in `Values` much faster if expressions in consecutive rows have the same structure. ClickHouse will try to deduce template of an expression, parse the following rows using this template and evaluate the expression on a batch of successfully parsed rows. For the following query:
|
||||
Enables or disables template deduction for SQL expressions in [Values](../../interfaces/formats.md#data-format-values) format. It allows parsing and interpreting expressions in `Values` much faster if expressions in consecutive rows have the same structure. ClickHouse tries to deduce template of an expression, parse the following rows using this template and evaluate the expression on a batch of successfully parsed rows.
|
||||
|
||||
Possible values:
|
||||
|
||||
- 0 — Disabled.
|
||||
- 1 — Enabled.
|
||||
|
||||
Default value: 1.
|
||||
|
||||
For the following query:
|
||||
|
||||
``` sql
|
||||
INSERT INTO test VALUES (lower('Hello')), (lower('world')), (lower('INSERT')), (upper('Values')), ...
|
||||
```
|
||||
|
||||
- if `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=0` expressions will be interpreted separately for each row (this is very slow for large number of rows)
|
||||
- if `input_format_values_interpret_expressions=0` and `format_values_deduce_templates_of_expressions=1` expressions in the first, second and third rows will be parsed using template `lower(String)` and interpreted together, expression is the forth row will be parsed with another template (`upper(String)`)
|
||||
- if `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=1` - the same as in previous case, but also allows fallback to interpreting expressions separately if it’s not possible to deduce template.
|
||||
|
||||
Enabled by default.
|
||||
- If `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=0`, expressions are interpreted separately for each row (this is very slow for large number of rows).
|
||||
- If `input_format_values_interpret_expressions=0` and `format_values_deduce_templates_of_expressions=1`, expressions in the first, second and third rows are parsed using template `lower(String)` and interpreted together, expression in the forth row is parsed with another template (`upper(String)`).
|
||||
- If `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=1`, the same as in previous case, but also allows fallback to interpreting expressions separately if it’s not possible to deduce template.
|
||||
|
||||
## input\_format\_values\_accurate\_types\_of\_literals {#settings-input-format-values-accurate-types-of-literals}
|
||||
|
||||
This setting is used only when `input_format_values_deduce_templates_of_expressions = 1`. It can happen, that expressions for some column have the same structure, but contain numeric literals of different types, e.g
|
||||
This setting is used only when `input_format_values_deduce_templates_of_expressions = 1`. It can happen, that expressions for some column have the same structure, but contain numeric literals of different types, e.g.
|
||||
|
||||
``` sql
|
||||
(..., abs(0), ...), -- UInt64 literal
|
||||
@ -242,9 +249,17 @@ This setting is used only when `input_format_values_deduce_templates_of_expressi
|
||||
(..., abs(-1), ...), -- Int64 literal
|
||||
```
|
||||
|
||||
When this setting is enabled, ClickHouse will check the actual type of literal and will use an expression template of the corresponding type. In some cases, it may significantly slow down expression evaluation in `Values`.
|
||||
When disabled, ClickHouse may use more general type for some literals (e.g. `Float64` or `Int64` instead of `UInt64` for `42`), but it may cause overflow and precision issues.
|
||||
Enabled by default.
|
||||
Possible values:
|
||||
|
||||
- 0 — Disabled.
|
||||
|
||||
In this case, ClickHouse may use a more general type for some literals (e.g., `Float64` or `Int64` instead of `UInt64` for `42`), but it may cause overflow and precision issues.
|
||||
|
||||
- 1 — Enabled.
|
||||
|
||||
In this case, ClickHouse checks the actual type of literal and uses an expression template of the corresponding type. In some cases, it may significantly slow down expression evaluation in `Values`.
|
||||
|
||||
Default value: 1.
|
||||
|
||||
## input\_format\_defaults\_for\_omitted\_fields {#session_settings-input_format_defaults_for_omitted_fields}
|
||||
|
||||
@ -507,6 +522,24 @@ Example:
|
||||
log_queries=1
|
||||
```
|
||||
|
||||
## log\_queries\_min\_type {#settings-log-queries-min-type}
|
||||
|
||||
`query_log` minimal type to log.
|
||||
|
||||
Possible values:
|
||||
- `QUERY_START` (`=1`)
|
||||
- `QUERY_FINISH` (`=2`)
|
||||
- `EXCEPTION_BEFORE_START` (`=3`)
|
||||
- `EXCEPTION_WHILE_PROCESSING` (`=4`)
|
||||
|
||||
Default value: `QUERY_START`.
|
||||
|
||||
Can be used to limit which entiries will goes to `query_log`, say you are interesting only in errors, then you can use `EXCEPTION_WHILE_PROCESSING`:
|
||||
|
||||
``` text
|
||||
log_queries_min_type='EXCEPTION_WHILE_PROCESSING'
|
||||
```
|
||||
|
||||
## log\_query\_threads {#settings-log-query-threads}
|
||||
|
||||
Setting up query threads logging.
|
||||
|
@ -989,7 +989,7 @@ Result:
|
||||
|
||||
## arrayZip {#arrayzip}
|
||||
|
||||
Combine multiple Array type columns into one Array\[Tuple(…)\] column
|
||||
Combines multiple arrays into a single array. The resulting array contains the corresponding elements of the source arrays grouped into tuples in the listed order of arguments.
|
||||
|
||||
**Syntax**
|
||||
|
||||
@ -999,28 +999,33 @@ arrayZip(arr1, arr2, ..., arrN)
|
||||
|
||||
**Parameters**
|
||||
|
||||
`arr` — Any number of [array](../../sql_reference/data_types/array.md) type columns to combine.
|
||||
- `arrN` — [Array](../data_types/array.md).
|
||||
|
||||
The function can take any number of arrays of different types. All the input arrays must be of equal size.
|
||||
|
||||
**Returned value**
|
||||
|
||||
The result of Array\[Tuple(…)\] type after the combination of these arrays
|
||||
- Array with elements from the source arrays grouped into [tuples](../data_types/tuple.md). Data types in the tuple are the same as types of the input arrays and in the same order as arrays are passed.
|
||||
|
||||
Type: [Array](../data_types/array.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT arrayZip(['a', 'b', 'c'], ['d', 'e', 'f']);
|
||||
SELECT arrayZip(['a', 'b', 'c'], [5, 2, 1])
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─arrayZip(['a', 'b', 'c'], ['d', 'e', 'f'])─┐
|
||||
│ [('a','d'),('b','e'),('c','f')] │
|
||||
└────────────────────────────────────────────┘
|
||||
┌─arrayZip(['a', 'b', 'c'], [5, 2, 1])─┐
|
||||
│ [('a',5),('b',2),('c',1)] │
|
||||
└──────────────────────────────────────┘
|
||||
```
|
||||
|
||||
|
||||
## arrayAUC {#arrayauc}
|
||||
Calculate AUC (Area Under the Curve, which is a concept in machine learning, see more details: https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve).
|
||||
|
||||
|
@ -5,8 +5,7 @@ toc_title: Operators
|
||||
|
||||
# Operators {#operators}
|
||||
|
||||
All operators are transformed to their corresponding functions at the query parsing stage in accordance with their precedence and associativity.
|
||||
Groups of operators are listed in order of priority (the higher it is in the list, the earlier the operator is connected to its arguments).
|
||||
ClickHouse transforms operators to their corresponding functions at the query parsing stage according to their priority, precedence, and associativity.
|
||||
|
||||
## Access Operators {#access-operators}
|
||||
|
||||
@ -78,7 +77,7 @@ Groups of operators are listed in order of priority (the higher it is in the lis
|
||||
EXTRACT(part FROM date);
|
||||
```
|
||||
|
||||
Extracts a part from a given date. For example, you can retrieve a month from a given date, or a second from a time.
|
||||
Extract parts from a given date. For example, you can retrieve a month from a given date, or a second from a time.
|
||||
|
||||
The `part` parameter specifies which part of the date to retrieve. The following values are available:
|
||||
|
||||
@ -151,7 +150,7 @@ Types of intervals:
|
||||
- `YEAR`
|
||||
|
||||
!!! warning "Warning"
|
||||
Intervals with different types can’t be combined. You can’t use expressions like `INTERVAL 4 DAY 1 HOUR`. Express intervals in units that are smaller or equal the the smallest unit of the interval, for example `INTERVAL 25 HOUR`. You can use consequtive operations like in the example below.
|
||||
Intervals with different types can’t be combined. You can’t use expressions like `INTERVAL 4 DAY 1 HOUR`. Specify intervals in units that are smaller or equal to the smallest unit of the interval, for example, `INTERVAL 25 HOUR`. You can use consecutive operations, like in the example below.
|
||||
|
||||
Example:
|
||||
|
||||
@ -214,7 +213,7 @@ The `transform` function does not work with `NULL`.
|
||||
|
||||
`x -> expr` – The `lambda(x, expr) function.`
|
||||
|
||||
The following operators do not have a priority, since they are brackets:
|
||||
The following operators do not have a priority since they are brackets:
|
||||
|
||||
## Array Creation Operator {#array-creation-operator}
|
||||
|
||||
@ -229,7 +228,7 @@ The following operators do not have a priority, since they are brackets:
|
||||
All binary operators have left associativity. For example, `1 + 2 + 3` is transformed to `plus(plus(1, 2), 3)`.
|
||||
Sometimes this doesn’t work the way you expect. For example, `SELECT 4 > 2 > 3` will result in 0.
|
||||
|
||||
For efficiency, the `and` and `or` functions accept any number of arguments. The corresponding chains of `AND` and `OR` operators are transformed to a single call of these functions.
|
||||
For efficiency, the `and` and `or` functions accept any number of arguments. The corresponding chains of `AND` and `OR` operators are transformed into a single call of these functions.
|
||||
|
||||
## Checking for `NULL` {#checking-for-null}
|
||||
|
||||
|
@ -204,7 +204,6 @@ The following operations with [partitions](../../engines/table_engines/mergetree
|
||||
- [DETACH PARTITION](#alter_detach-partition) – Moves a partition to the `detached` directory and forget it.
|
||||
- [DROP PARTITION](#alter_drop-partition) – Deletes a partition.
|
||||
- [ATTACH PART\|PARTITION](#alter_attach-partition) – Adds a part or partition from the `detached` directory to the table.
|
||||
- [REPLACE PARTITION](#alter_replace-partition) - Copies the data partition from one table to another.
|
||||
- [ATTACH PARTITION FROM](#alter_attach-partition-from) – Copies the data partition from one table to another and adds.
|
||||
- [REPLACE PARTITION](#alter_replace-partition) - Copies the data partition from one table to another and replaces.
|
||||
- [MOVE PARTITION TO TABLE](#alter_move_to_table-partition) (\#alter\_move\_to\_table-partition) - Move the data partition from one table to another.
|
||||
|
@ -15,24 +15,18 @@ CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(..
|
||||
|
||||
### Clauses {#clauses}
|
||||
|
||||
- `IF NOT EXISTS`
|
||||
- `IF NOT EXISTS`
|
||||
If the `db_name` database already exists, then ClickHouse doesn't create a new database and:
|
||||
- Doesn't throw an exception if clause is specified.
|
||||
- Throws an exception if clause isn't specified.
|
||||
|
||||
If the `db_name` database already exists, then ClickHouse doesn't create a new database and:
|
||||
|
||||
- Doesn't throw an exception if clause is specified.
|
||||
- Throws an exception if clause isn't specified.
|
||||
|
||||
- `ON CLUSTER`
|
||||
|
||||
ClickHouse creates the `db_name` database on all the servers of a specified cluster.
|
||||
- `ON CLUSTER`
|
||||
ClickHouse creates the `db_name` database on all the servers of a specified cluster.
|
||||
|
||||
- `ENGINE`
|
||||
|
||||
- [MySQL](../engines/database_engines/mysql.md)
|
||||
|
||||
Allows you to retrieve data from the remote MySQL server.
|
||||
|
||||
By default, ClickHouse uses its own [database engine](../engines/database_engines/index.md).
|
||||
- [MySQL](../../engines/database_engines/mysql.md)
|
||||
Allows you to retrieve data from the remote MySQL server.
|
||||
By default, ClickHouse uses its own [database engine](../../engines/database_engines/index.md).
|
||||
|
||||
## CREATE TABLE {#create-table-query}
|
||||
|
||||
|
@ -2,4 +2,3 @@
|
||||
toc_folder_title: Statements
|
||||
toc_priority: 31
|
||||
---
|
||||
|
||||
|
@ -16,11 +16,11 @@ INSERT INTO t VALUES (1, 'Hello, world'), (2, 'abc'), (3, 'def')
|
||||
The `INSERT INTO t VALUES` fragment is parsed by the full parser, and the data `(1, 'Hello, world'), (2, 'abc'), (3, 'def')` is parsed by the fast stream parser. You can also turn on the full parser for the data by using the [input\_format\_values\_interpret\_expressions](../operations/settings/settings.md#settings-input_format_values_interpret_expressions) setting. When `input_format_values_interpret_expressions = 1`, ClickHouse first tries to parse values with the fast stream parser. If it fails, ClickHouse tries to use the full parser for the data, treating it like an SQL [expression](#syntax-expressions).
|
||||
|
||||
Data can have any format. When a query is received, the server calculates no more than [max\_query\_size](../operations/settings/settings.md#settings-max_query_size) bytes of the request in RAM (by default, 1 MB), and the rest is stream parsed.
|
||||
This means the system doesn’t have problems with large `INSERT` queries, like MySQL does.
|
||||
It allows for avoiding issues with large `INSERT` queries.
|
||||
|
||||
When using the `Values` format in an `INSERT` query, it may seem that data is parsed the same as expressions in a `SELECT` query, but this is not true. The `Values` format is much more limited.
|
||||
|
||||
Next we will cover the full parser. For more information about format parsers, see the [Formats](../interfaces/formats.md) section.
|
||||
The rest of this article covers the full parser. For more information about format parsers, see the [Formats](../interfaces/formats.md) section.
|
||||
|
||||
## Spaces {#spaces}
|
||||
|
||||
@ -28,33 +28,33 @@ There may be any number of space symbols between syntactical constructions (incl
|
||||
|
||||
## Comments {#comments}
|
||||
|
||||
SQL-style and C-style comments are supported.
|
||||
SQL-style comments: from `--` to the end of the line. The space after `--` can be omitted.
|
||||
Comments in C-style: from `/*` to `*/`. These comments can be multiline. Spaces are not required here, either.
|
||||
ClickHouse supports either SQL-style and C-style comments.
|
||||
SQL-style comments start with `--` and continue to the end of the line, a space after `--` can be omitted.
|
||||
C-style are from `/*` to `*/`and can be multiline, spaces are not required either.
|
||||
|
||||
## Keywords {#syntax-keywords}
|
||||
|
||||
Keywords are case-insensitive when they correspond to:
|
||||
|
||||
- SQL standard. For example, `SELECT`, `select` and `SeLeCt` are all valid.
|
||||
- Implementation in some popular DBMS (MySQL or Postgres). For example, `DateTime` is same as `datetime`.
|
||||
- Implementation in some popular DBMS (MySQL or Postgres). For example, `DateTime` is the same as `datetime`.
|
||||
|
||||
Whether data type name is case-sensitive can be checked in the `system.data_type_families` table.
|
||||
|
||||
In contrast to standard SQL all other keywords (including functions names) are **case-sensitive**.
|
||||
In contrast to standard SQL, all other keywords (including functions names) are **case-sensitive**.
|
||||
|
||||
Keywords are not reserved (they are just parsed as keywords in the corresponding context). If you use [identifiers](#syntax-identifiers) the same as the keywords, enclose them into quotes. For example, the query `SELECT "FROM" FROM table_name` is valid if the table `table_name` has column with the name `"FROM"`.
|
||||
Keywords are not reserved; they are treated as such only in the corresponding context. If you use [identifiers](#syntax-identifiers) with the same name as the keywords, enclose them into double-quotes or backticks. For example, the query `SELECT "FROM" FROM table_name` is valid if the table `table_name` has column with the name `"FROM"`.
|
||||
|
||||
## Identifiers {#syntax-identifiers}
|
||||
|
||||
Identifiers are:
|
||||
|
||||
- Cluster, database, table, partition and column names.
|
||||
- Cluster, database, table, partition, and column names.
|
||||
- Functions.
|
||||
- Data types.
|
||||
- [Expression aliases](#syntax-expression_aliases).
|
||||
|
||||
Identifiers can be quoted or non-quoted. It is recommended to use non-quoted identifiers.
|
||||
Identifiers can be quoted or non-quoted. The latter is preferred.
|
||||
|
||||
Non-quoted identifiers must match the regex `^[a-zA-Z_][0-9a-zA-Z_]*$` and can not be equal to [keywords](#syntax-keywords). Examples: `x, _1, X_y__Z123_.`
|
||||
|
||||
@ -62,34 +62,34 @@ If you want to use identifiers the same as keywords or you want to use other sym
|
||||
|
||||
## Literals {#literals}
|
||||
|
||||
There are: numeric, string, compound and `NULL` literals.
|
||||
There are numeric, string, compound, and `NULL` literals.
|
||||
|
||||
### Numeric {#numeric}
|
||||
|
||||
A numeric literal tries to be parsed:
|
||||
Numeric literal tries to be parsed:
|
||||
|
||||
- First as a 64-bit signed number, using the [strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul) function.
|
||||
- First, as a 64-bit signed number, using the [strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul) function.
|
||||
- If unsuccessful, as a 64-bit unsigned number, using the [strtoll](https://en.cppreference.com/w/cpp/string/byte/strtol) function.
|
||||
- If unsuccessful, as a floating-point number using the [strtod](https://en.cppreference.com/w/cpp/string/byte/strtof) function.
|
||||
- Otherwise, an error is returned.
|
||||
- Otherwise, it returns an error.
|
||||
|
||||
The corresponding value will have the smallest type that the value fits in.
|
||||
Literal value has the smallest type that the value fits in.
|
||||
For example, 1 is parsed as `UInt8`, but 256 is parsed as `UInt16`. For more information, see [Data types](../sql_reference/data_types/index.md).
|
||||
|
||||
Examples: `1`, `18446744073709551615`, `0xDEADBEEF`, `01`, `0.1`, `1e100`, `-1e-100`, `inf`, `nan`.
|
||||
|
||||
### String {#syntax-string-literal}
|
||||
|
||||
Only string literals in single quotes are supported. The enclosed characters can be backslash-escaped. The following escape sequences have a corresponding special value: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\a`, `\v`, `\xHH`. In all other cases, escape sequences in the format `\c`, where `c` is any character, are converted to `c`. This means that you can use the sequences `\'`and`\\`. The value will have the [String](../sql_reference/data_types/string.md) type.
|
||||
Only string literals in single quotes are supported. The enclosed characters can be backslash-escaped. The following escape sequences have a corresponding special value: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\a`, `\v`, `\xHH`. In all other cases, escape sequences in the format `\c`, where `c` is any character, are converted to `c`. It means that you can use the sequences `\'`and`\\`. The value will have the [String](../sql_reference/data_types/string.md) type.
|
||||
|
||||
The minimum set of characters that you need to escape in string literals: `'` and `\`. Single quote can be escaped with the single quote, literals `'It\'s'` and `'It''s'` are equal.
|
||||
In string literals, you need to escape at least `'` and `\`. Single quotes can be escaped with the single quote, literals `'It\'s'` and `'It''s'` are equal.
|
||||
|
||||
### Compound {#compound}
|
||||
|
||||
Constructions are supported for arrays: `[1, 2, 3]` and tuples: `(1, 'Hello, world!', 2)`..
|
||||
Actually, these are not literals, but expressions with the array creation operator and the tuple creation operator, respectively.
|
||||
Arrays are constructed with square brackets `[1, 2, 3]`. Nuples are constructed with round brackets `(1, 'Hello, world!', 2)`.
|
||||
Technically these are not literals, but expressions with the array creation operator and the tuple creation operator, respectively.
|
||||
An array must consist of at least one item, and a tuple must have at least two items.
|
||||
Tuples have a special purpose for use in the `IN` clause of a `SELECT` query. Tuples can be obtained as the result of a query, but they can’t be saved to a database (with the exception of [Memory](../engines/table_engines/special/memory.md) tables).
|
||||
There's a separate case when tuples appear in the `IN` clause of a `SELECT` query. Query results can include tuples, but tuples can’t be saved to a database (except of tables with [Memory](../engines/table_engines/special/memory.md) engine).
|
||||
|
||||
### NULL {#null-literal}
|
||||
|
||||
@ -99,13 +99,13 @@ In order to store `NULL` in a table field, it must be of the [Nullable](../sql_r
|
||||
|
||||
Depending on the data format (input or output), `NULL` may have a different representation. For more information, see the documentation for [data formats](../interfaces/formats.md#formats).
|
||||
|
||||
There are many nuances to processing `NULL`. For example, if at least one of the arguments of a comparison operation is `NULL`, the result of this operation will also be `NULL`. The same is true for multiplication, addition, and other operations. For more information, read the documentation for each operation.
|
||||
There are many nuances to processing `NULL`. For example, if at least one of the arguments of a comparison operation is `NULL`, the result of this operation is also `NULL`. The same is true for multiplication, addition, and other operations. For more information, read the documentation for each operation.
|
||||
|
||||
In queries, you can check `NULL` using the [IS NULL](operators.md#operator-is-null) and [IS NOT NULL](operators.md) operators and the related functions `isNull` and `isNotNull`.
|
||||
|
||||
## Functions {#functions}
|
||||
|
||||
Functions are written like an identifier with a list of arguments (possibly empty) in brackets. In contrast to standard SQL, the brackets are required, even for an empty arguments list. Example: `now()`.
|
||||
Function calls are written like an identifier with a list of arguments (possibly empty) in round brackets. In contrast to standard SQL, the brackets are required, even for an empty argument list. Example: `now()`.
|
||||
There are regular and aggregate functions (see the section “Aggregate functions”). Some aggregate functions can contain two lists of arguments in brackets. Example: `quantile (0.9) (x)`. These aggregate functions are called “parametric” functions, and the arguments in the first list are called “parameters”. The syntax of aggregate functions without parameters is the same as for regular functions.
|
||||
|
||||
## Operators {#operators}
|
||||
@ -115,11 +115,11 @@ For example, the expression `1 + 2 * 3 + 4` is transformed to `plus(plus(1, mult
|
||||
|
||||
## Data Types and Database Table Engines {#data_types-and-database-table-engines}
|
||||
|
||||
Data types and table engines in the `CREATE` query are written the same way as identifiers or functions. In other words, they may or may not contain an arguments list in brackets. For more information, see the sections “Data types,” “Table engines,” and “CREATE”.
|
||||
Data types and table engines in the `CREATE` query are written the same way as identifiers or functions. In other words, they may or may not contain an argument list in brackets. For more information, see the sections “Data types,” “Table engines,” and “CREATE”.
|
||||
|
||||
## Expression Aliases {#syntax-expression_aliases}
|
||||
|
||||
An alias is a user-defined name for an expression in a query.
|
||||
An alias is a user-defined name for expression in a query.
|
||||
|
||||
``` sql
|
||||
expr AS alias
|
||||
@ -141,7 +141,7 @@ expr AS alias
|
||||
|
||||
### Notes on Usage {#notes-on-usage}
|
||||
|
||||
Aliases are global for a query or subquery and you can define an alias in any part of a query for any expression. For example, `SELECT (1 AS n) + 2, n`.
|
||||
Aliases are global for a query or subquery, and you can define an alias in any part of a query for any expression. For example, `SELECT (1 AS n) + 2, n`.
|
||||
|
||||
Aliases are not visible in subqueries and between subqueries. For example, while executing the query `SELECT (SELECT sum(b.a) + num FROM b) - a.a AS num FROM a` ClickHouse generates the exception `Unknown identifier: num`.
|
||||
|
||||
@ -182,4 +182,4 @@ An expression is a function, identifier, literal, application of an operator, ex
|
||||
A list of expressions is one or more expressions separated by commas.
|
||||
Functions and operators, in turn, can have expressions as arguments.
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/query_language/syntax/) <!--hide-->
|
||||
[Original article](https://clickhouse.tech/docs/en/sql_reference/syntax/) <!--hide-->
|
||||
|
@ -240,7 +240,7 @@ toc_title: '2020'
|
||||
* Updated checking for hung queries in clickhouse-test script [#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz))
|
||||
* Removed some useless files from repository. [#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
* Changed type of math perftests from `once` to `loop`. [#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||
* Add docker image which allows to build interactive code browser HTML report for our codebase. [#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) See [Woboq Code Browser](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
* Add docker image which allows to build interactive code browser HTML report for our codebase. [#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) See [Woboq Code Browser](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
* Suppress some test failures under MSan. [#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm))
|
||||
* Speedup "exception while insert" test. This test often time out in debug-with-coverage build. [#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
* Updated `libcxx` and `libcxxabi` to master. In preparation to [#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
|
@ -7,7 +7,7 @@ toc_title: "Examinar el c\xF3digo fuente de ClickHouse"
|
||||
|
||||
# Examinar el código fuente de ClickHouse {#browse-clickhouse-source-code}
|
||||
|
||||
Usted puede utilizar **Woboq** navegador de código en línea disponible [aqui](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/src/index.html). Proporciona navegación de código y resaltado semántico, búsqueda e indexación. La instantánea de código se actualiza diariamente.
|
||||
Usted puede utilizar **Woboq** navegador de código en línea disponible [aqui](https://clickhouse.tech/codebrowser/html_report///ClickHouse/src/index.html). Proporciona navegación de código y resaltado semántico, búsqueda e indexación. La instantánea de código se actualiza diariamente.
|
||||
|
||||
Además, puede navegar por las fuentes en [GitHub](https://github.com/ClickHouse/ClickHouse) como de costumbre.
|
||||
|
||||
|
@ -17,7 +17,7 @@ Las pruebas se encuentran en `queries` directorio. Hay dos subdirectorios: `stat
|
||||
|
||||
Cada prueba puede ser de dos tipos: `.sql` y `.sh`. `.sql` test es el script SQL simple que se canaliza a `clickhouse-client --multiquery --testmode`. `.sh` test es un script que se ejecuta por sí mismo.
|
||||
|
||||
Para ejecutar todas las pruebas, use `testskhouse-test` herramienta. Mira `--help` para la lista de posibles opciones. Simplemente puede ejecutar todas las pruebas o ejecutar un subconjunto de pruebas filtradas por subcadena en el nombre de la prueba: `./clickhouse-test substring`.
|
||||
Para ejecutar todas las pruebas, use `clickhouse-test` herramienta. Mira `--help` para la lista de posibles opciones. Simplemente puede ejecutar todas las pruebas o ejecutar un subconjunto de pruebas filtradas por subcadena en el nombre de la prueba: `./clickhouse-test substring`.
|
||||
|
||||
La forma más sencilla de invocar pruebas funcionales es copiar `clickhouse-client` a `/usr/bin/`, ejecutar `clickhouse-server` y luego ejecutar `./clickhouse-test` de su propio directorio.
|
||||
|
||||
@ -36,13 +36,13 @@ deshabilitar estos grupos de pruebas utilizando `--no-zookeeper`, `--no-shard` y
|
||||
|
||||
## Bugs conocidos {#known-bugs}
|
||||
|
||||
Si conocemos algunos errores que se pueden reproducir fácilmente mediante pruebas funcionales, colocamos pruebas funcionales preparadas en `queries/bugs` directorio. Estas pruebas se moverán a `teststests_stateless` cuando se corrigen errores.
|
||||
Si conocemos algunos errores que se pueden reproducir fácilmente mediante pruebas funcionales, colocamos pruebas funcionales preparadas en `tests/queries/bugs` directorio. Estas pruebas se moverán a `tests/queries/0_stateless` cuando se corrigen errores.
|
||||
|
||||
## Pruebas de integración {#integration-tests}
|
||||
|
||||
Las pruebas de integración permiten probar ClickHouse en la configuración agrupada y la interacción de ClickHouse con otros servidores como MySQL, Postgres, MongoDB. Son útiles para emular divisiones de red, caídas de paquetes, etc. Estas pruebas se ejecutan bajo Docker y crean múltiples contenedores con varios software.
|
||||
|
||||
Ver `testsgration/README.md` sobre cómo ejecutar estas pruebas.
|
||||
Ver `tests/integration/README.md` sobre cómo ejecutar estas pruebas.
|
||||
|
||||
Tenga en cuenta que la integración de ClickHouse con controladores de terceros no se ha probado. Además, actualmente no tenemos pruebas de integración con nuestros controladores JDBC y ODBC.
|
||||
|
||||
|
@ -68,4 +68,10 @@ ClickHouse utiliza la replicación multi-maestro asincrónica. Después de escri
|
||||
|
||||
Para obtener más información, consulte la sección [Replicación de datos](../engines/table_engines/mergetree_family/replication.md).
|
||||
|
||||
## Características que pueden considerarse desventajas {#clickhouse-features-that-can-be-considered-disadvantages}
|
||||
|
||||
1. No hay transacciones completas.
|
||||
2. Falta de capacidad para modificar o eliminar datos ya insertados con alta tasa y baja latencia. Hay eliminaciones y actualizaciones por lotes disponibles para limpiar o modificar datos, por ejemplo, para cumplir con [GDPR](https://gdpr-info.eu).
|
||||
3. El índice disperso hace que ClickHouse no sea tan adecuado para consultas de puntos que recuperan filas individuales por sus claves.
|
||||
|
||||
[Artículo Original](https://clickhouse.tech/docs/en/introduction/distinctive_features/) <!--hide-->
|
||||
|
@ -1,14 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 3e185d24c9fe772c7cf03d5475247fb829a21dfa
|
||||
toc_priority: 5
|
||||
toc_title: "Caracter\xEDsticas de ClickHouse que pueden considerarse desventajas"
|
||||
---
|
||||
|
||||
# Características de ClickHouse que pueden considerarse desventajas {#clickhouse-features-that-can-be-considered-disadvantages}
|
||||
|
||||
1. No hay transacciones completas.
|
||||
2. Falta de capacidad para modificar o eliminar datos ya insertados con alta tasa y baja latencia. Hay eliminaciones y actualizaciones por lotes disponibles para limpiar o modificar datos, por ejemplo, para cumplir con [GDPR](https://gdpr-info.eu).
|
||||
3. El índice disperso hace que ClickHouse no sea tan adecuado para consultas de puntos que recuperan filas individuales por sus claves.
|
||||
|
||||
[Artículo Original](https://clickhouse.tech/docs/en/introduction/features_considered_disadvantages/) <!--hide-->
|
@ -249,7 +249,7 @@ toc_title: '2020'
|
||||
- Comprobación actualizada de consultas colgadas en el script de prueba de clickhouse [\#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alejandro Kazakov](https://github.com/Akazz))
|
||||
- Se eliminaron algunos archivos inútiles del repositorio. [\#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
- Tipo cambiado de perftests matemáticos de `once` a `loop`. [\#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||
- Agregue una imagen acoplable que permite construir un informe HTML del navegador de código interactivo para nuestra base de código. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) Ver [Navegador de código Woboq](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
- Agregue una imagen acoplable que permite construir un informe HTML del navegador de código interactivo para nuestra base de código. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) Ver [Navegador de código Woboq](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
- Suprima algunas fallas de prueba bajo MSan. [\#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alejandro Kuzmenkov](https://github.com/akuzm))
|
||||
- Aceleración “exception while insert” prueba. Esta prueba a menudo se agota en la compilación de depuración con cobertura. [\#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
- Actualizar `libcxx` y `libcxxabi` dominar. En preparación para [\#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [\#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
|
@ -8,7 +8,7 @@ toc_title: "\u0645\u0631\u0648\u0631 \u06A9\u062F \u0645\u0646\u0628\u0639 \u06A
|
||||
|
||||
# فهرست clickhouse کد منبع {#browse-clickhouse-source-code}
|
||||
|
||||
شما می توانید استفاده کنید **ووبوک** آنلاین کد مرورگر موجود [اینجا](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/index.html). این فراهم می کند ناوبری کد و برجسته معنایی, جستجو و نمایه سازی. عکس فوری کد روزانه به روز می شود.
|
||||
شما می توانید استفاده کنید **ووبوک** آنلاین کد مرورگر موجود [اینجا](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/index.html). این فراهم می کند ناوبری کد و برجسته معنایی, جستجو و نمایه سازی. عکس فوری کد روزانه به روز می شود.
|
||||
|
||||
همچنین شما می توانید فهرست منابع در [گیتهاب](https://github.com/ClickHouse/ClickHouse) به عنوان معمول است.
|
||||
|
||||
|
@ -18,7 +18,7 @@ toc_title: "\u0646\u062D\u0648\u0647 \u0627\u062C\u0631\u0627\u06CC \u062A\u0633
|
||||
|
||||
هر تست می تواند یکی از دو نوع باشد: `.sql` و `.sh`. `.sql` تست اسکریپت ساده مربع است که به لوله کشی است `clickhouse-client --multiquery --testmode`. `.sh` تست یک اسکریپت است که به خودی خود اجرا است.
|
||||
|
||||
برای اجرای تمام تست ها استفاده کنید `testskhouse-test` ابزار. نگاه کن `--help` برای لیستی از گزینه های ممکن. شما به سادگی می توانید تمام تست ها را اجرا کنید یا زیر مجموعه ای از تست های فیلتر شده توسط زیر رشته را در نام تست اجرا کنید: `./clickhouse-test substring`.
|
||||
برای اجرای تمام تست ها استفاده کنید `clickhouse-test` ابزار. نگاه کن `--help` برای لیستی از گزینه های ممکن. شما به سادگی می توانید تمام تست ها را اجرا کنید یا زیر مجموعه ای از تست های فیلتر شده توسط زیر رشته را در نام تست اجرا کنید: `./clickhouse-test substring`.
|
||||
|
||||
ساده ترین راه برای فراخوانی تست های کاربردی کپی است `clickhouse-client` به `/usr/bin/` فرار کن `clickhouse-server` و سپس اجرا کنید `./clickhouse-test` از دایرکتوری خود را.
|
||||
|
||||
@ -37,13 +37,13 @@ toc_title: "\u0646\u062D\u0648\u0647 \u0627\u062C\u0631\u0627\u06CC \u062A\u0633
|
||||
|
||||
## اشکالات شناخته شده {#known-bugs}
|
||||
|
||||
اگر ما می دانیم برخی از اشکالات است که می تواند به راحتی توسط تست های کاربردی تکثیر, ما تست های عملکردی تهیه شده در `queries/bugs` فهرست راهنما. این تست خواهد شد به نقل مکان کرد `teststests_stateless` هنگامی که اشکالات ثابت هستند.
|
||||
اگر ما می دانیم برخی از اشکالات است که می تواند به راحتی توسط تست های کاربردی تکثیر, ما تست های عملکردی تهیه شده در `tests/queries/bugs` فهرست راهنما. این تست خواهد شد به نقل مکان کرد `tests/queries/0_stateless` هنگامی که اشکالات ثابت هستند.
|
||||
|
||||
## تست های ادغام {#integration-tests}
|
||||
|
||||
ادغام آزمون اجازه می دهد برای تست clickhouse در خوشه پیکربندی و clickhouse تعامل با سرور های دیگر مانند mysql, postgres, mongodb. مفید برای تقلید انشعابات شبکه قطره بسته و غیره هستند. این تست ها تحت کارگر بارانداز اجرا و ایجاد ظروف متعدد با نرم افزار های مختلف.
|
||||
|
||||
ببینید `testsgration/README.md` در مورد چگونگی اجرای این تست.
|
||||
ببینید `tests/integration/README.md` در مورد چگونگی اجرای این تست.
|
||||
|
||||
توجه داشته باشید که ادغام کلیک با رانندگان شخص ثالث تست نشده است. همچنین ما در حال حاضر تست های یکپارچه سازی با رانندگان جی بی سی و بی سی ما ندارد.
|
||||
|
||||
|
@ -62,6 +62,12 @@ ClickHouse از روش asynchronous multimaster replication استفاده می
|
||||
|
||||
برای اطلاعات بیشتر، به بخش [replication داده ها](../engines/table_engines/mergetree_family/replication.md) مراجعه کنید.
|
||||
|
||||
## ویژگی های از ClickHouse که می تواند معایبی باشد. {#wyjgy-hy-z-clickhouse-khh-my-twnd-m-yby-bshd}
|
||||
|
||||
1. بدون پشتیبانی کامل از تراکنش
|
||||
2. عدم توانایی برای تغییر و یا حذف داده های در حال حاضر وارد شده با سرعت بالا و تاخیر کم. برای پاک کردن و یا اصلاح داده ها، به عنوان مثال برای پیروی از [GDPR](https://gdpr-info.eu)، دسته ای پاک و به روزرسانی وجود دارد.حال توسعه می باشد.
|
||||
3. Sparse index باعث می شود ClickHouse چندان مناسب اجرای پرسمان های point query برای دریافت یک ردیف از داده ها با استفاده از کلید آنها نباشد.
|
||||
|
||||
</div>
|
||||
|
||||
[مقاله اصلی](https://clickhouse.tech/docs/fa/introduction/distinctive_features/) <!--hide-->
|
||||
|
@ -1,11 +0,0 @@
|
||||
<div markdown="1" markdown="1" dir="rtl">
|
||||
|
||||
# ویژگی های از ClickHouse که می تواند معایبی باشد. {#wyjgy-hy-z-clickhouse-khh-my-twnd-m-yby-bshd}
|
||||
|
||||
1. بدون پشتیبانی کامل از تراکنش
|
||||
2. عدم توانایی برای تغییر و یا حذف داده های در حال حاضر وارد شده با سرعت بالا و تاخیر کم. برای پاک کردن و یا اصلاح داده ها، به عنوان مثال برای پیروی از [GDPR](https://gdpr-info.eu)، دسته ای پاک و به روزرسانی وجود دارد.حال توسعه می باشد.
|
||||
3. Sparse index باعث می شود ClickHouse چندان مناسب اجرای پرسمان های point query برای دریافت یک ردیف از داده ها با استفاده از کلید آنها نباشد.
|
||||
|
||||
</div>
|
||||
|
||||
[مقاله اصلی](https://clickhouse.tech/docs/fa/introduction/features_considered_disadvantages/) <!--hide-->
|
@ -249,7 +249,7 @@ toc_title: '2020'
|
||||
- به روز شده در چک کردن برای نمایش داده شد را قطع کرد در اسکریپت کلیک تست [\#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([الکساندر کازاکوف](https://github.com/Akazz))
|
||||
- حذف برخی از فایل های بی فایده از مخزن. [\#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([الکسی میلویدو](https://github.com/alexey-milovidov))
|
||||
- نوع تغییر کامل ریاضی از `once` به `loop`. [\#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([نیکولای کوچتو](https://github.com/KochetovNicolai))
|
||||
- اضافه کردن تصویر کارگر بارانداز که اجازه می دهد تا برای ساخت کد تعاملی مرورگر گزارش متنی برای کدهای ما. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([الساپین](https://github.com/alesapin)) ببینید [مرورگر کد ووبوک](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
- اضافه کردن تصویر کارگر بارانداز که اجازه می دهد تا برای ساخت کد تعاملی مرورگر گزارش متنی برای کدهای ما. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([الساپین](https://github.com/alesapin)) ببینید [مرورگر کد ووبوک](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
- سرکوب برخی از شکست تست تحت مسان. [\#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([الکساندر کوزمنکوف](https://github.com/akuzm))
|
||||
- افزایش سرعت “exception while insert” امتحان این تست اغلب زمان در اشکال زدایی با پوشش ساخت. [\#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([الکسی میلویدو](https://github.com/alexey-milovidov))
|
||||
- به روز شده `libcxx` و `libcxxabi` به سلامتی استاد در تهیه به [\#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [\#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([الکسی میلویدو](https://github.com/alexey-milovidov))
|
||||
|
@ -7,7 +7,7 @@ toc_title: Parcourir Le Code Source De ClickHouse
|
||||
|
||||
# Parcourir Le Code Source De ClickHouse {#browse-clickhouse-source-code}
|
||||
|
||||
Vous pouvez utiliser **Woboq** navigateur de code en ligne disponible [ici](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/index.html). Il fournit la navigation de code et la mise en évidence sémantique, la recherche et l'indexation. L'instantané de code est mis à jour quotidiennement.
|
||||
Vous pouvez utiliser **Woboq** navigateur de code en ligne disponible [ici](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/index.html). Il fournit la navigation de code et la mise en évidence sémantique, la recherche et l'indexation. L'instantané de code est mis à jour quotidiennement.
|
||||
|
||||
Aussi, vous pouvez parcourir les sources sur [GitHub](https://github.com/ClickHouse/ClickHouse) comme à l'habitude.
|
||||
|
||||
|
@ -17,7 +17,7 @@ Les Tests sont situés dans `queries` répertoire. Il y a deux sous-répertoires
|
||||
|
||||
Chaque test peut être de deux types: `.sql` et `.sh`. `.sql` test est le script SQL simple qui est canalisé vers `clickhouse-client --multiquery --testmode`. `.sh` test est un script qui est exécuté par lui-même.
|
||||
|
||||
Pour exécuter tous les tests, utilisez `testskhouse-test` outil. Regarder `--help` pour la liste des options possibles. Vous pouvez simplement exécuter tous les tests ou exécuter un sous ensemble de tests filtrés par sous chaîne dans le nom du test: `./clickhouse-test substring`.
|
||||
Pour exécuter tous les tests, utilisez `clickhouse-test` outil. Regarder `--help` pour la liste des options possibles. Vous pouvez simplement exécuter tous les tests ou exécuter un sous ensemble de tests filtrés par sous chaîne dans le nom du test: `./clickhouse-test substring`.
|
||||
|
||||
Le moyen le plus simple d'invoquer des tests fonctionnels est de copier `clickhouse-client` de `/usr/bin/`, exécuter `clickhouse-server` et puis exécutez `./clickhouse-test` à partir de son propre répertoire.
|
||||
|
||||
@ -36,13 +36,13 @@ désactivez ces groupes de tests en utilisant `--no-zookeeper`, `--no-shard` et
|
||||
|
||||
## Bugs connus {#known-bugs}
|
||||
|
||||
Si nous connaissons des bugs qui peuvent être facilement reproduits par des tests fonctionnels, nous plaçons des tests fonctionnels préparés dans `queries/bugs` répertoire. Ces tests seront déplacés à `teststests_stateless` quand les bugs sont corrigés.
|
||||
Si nous connaissons des bugs qui peuvent être facilement reproduits par des tests fonctionnels, nous plaçons des tests fonctionnels préparés dans `tests/queries/bugs` répertoire. Ces tests seront déplacés à `tests/queries/0_stateless` quand les bugs sont corrigés.
|
||||
|
||||
## Les Tests D'Intégration {#integration-tests}
|
||||
|
||||
Les tests d'intégration permettent de tester ClickHouse en configuration cluster et clickhouse interaction avec D'autres serveurs comme MySQL, Postgres, MongoDB. Ils sont utiles pour émuler les splits réseau, les chutes de paquets, etc. Ces tests sont exécutés sous Docker et créent plusieurs conteneurs avec divers logiciels.
|
||||
|
||||
Voir `testsgration/README.md` sur la façon d'exécuter ces tests.
|
||||
Voir `tests/integration/README.md` sur la façon d'exécuter ces tests.
|
||||
|
||||
Notez que l'intégration de ClickHouse avec des pilotes tiers n'est pas testée. De plus, nous n'avons actuellement pas de tests d'intégration avec nos pilotes JDBC et ODBC.
|
||||
|
||||
|
@ -68,4 +68,10 @@ ClickHouse utilise la réplication multi-maître asynchrone. Après avoir été
|
||||
|
||||
Pour plus d'informations, consultez la section [Réplication des données](../engines/table_engines/mergetree_family/replication.md).
|
||||
|
||||
## Caractéristiques de ClickHouse qui peuvent être considérées comme des inconvénients {#clickhouse-features-that-can-be-considered-disadvantages}
|
||||
|
||||
1. Pas de transactions à part entière.
|
||||
2. Manque de capacité à modifier ou supprimer des données déjà insérées avec un taux élevé et une faible latence. Des suppressions et des mises à jour par lots sont disponibles pour nettoyer ou modifier les données, par exemple pour [GDPR](https://gdpr-info.eu).
|
||||
3. L'index clairsemé rend ClickHouse pas si approprié pour les requêtes ponctuelles récupérant des lignes simples par leurs clés.
|
||||
|
||||
[Article Original](https://clickhouse.tech/docs/en/introduction/distinctive_features/) <!--hide-->
|
||||
|
@ -1,15 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: f865c9653f9df092694258e0ccdd733c339112f5
|
||||
toc_priority: 5
|
||||
toc_title: "Caract\xE9ristiques de ClickHouse qui peuvent \xEAtre consid\xE9r\xE9\
|
||||
es comme des inconv\xE9nients"
|
||||
---
|
||||
|
||||
# Caractéristiques de ClickHouse qui peuvent être considérées comme des inconvénients {#clickhouse-features-that-can-be-considered-disadvantages}
|
||||
|
||||
1. Pas de transactions à part entière.
|
||||
2. Manque de capacité à modifier ou supprimer des données déjà insérées avec un taux élevé et une faible latence. Des suppressions et des mises à jour par lots sont disponibles pour nettoyer ou modifier les données, par exemple pour [GDPR](https://gdpr-info.eu).
|
||||
3. L'index clairsemé rend ClickHouse pas si approprié pour les requêtes ponctuelles récupérant des lignes simples par leurs clés.
|
||||
|
||||
[Article Original](https://clickhouse.tech/docs/en/introduction/features_considered_disadvantages/) <!--hide-->
|
@ -249,7 +249,7 @@ toc_title: '2020'
|
||||
- Mise à jour de la vérification des requêtes suspendues dans le script clickhouse-test [\#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz))
|
||||
- Suppression de certains fichiers inutiles du référentiel. [\#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexeï-milovidov](https://github.com/alexey-milovidov))
|
||||
- Changement de type de math perftests de `once` de `loop`. [\#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||
- Ajouter une image docker qui permet de créer un rapport HTML interactif du navigateur de code pour notre base de code. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alésapine](https://github.com/alesapin)) Voir [Navigateur De Code Woboq](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/src/src/index.html)
|
||||
- Ajouter une image docker qui permet de créer un rapport HTML interactif du navigateur de code pour notre base de code. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alésapine](https://github.com/alesapin)) Voir [Navigateur De Code Woboq](https://clickhouse.tech/codebrowser/html_report///ClickHouse/src/src/index.html)
|
||||
- Supprimer certains échecs de test sous MSan. [\#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm))
|
||||
- SpeedUp “exception while insert” test. Ce test expire souvent dans la construction debug-with-coverage. [\#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexeï-milovidov](https://github.com/alexey-milovidov))
|
||||
- Mettre `libcxx` et `libcxxabi` maîtriser. En préparation à [\#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [\#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexeï-milovidov](https://github.com/alexey-milovidov))
|
||||
|
@ -7,7 +7,7 @@ toc_title: "ClickHouse\u306E\u30BD\u30FC\u30B9\u30B3\u30FC\u30C9\u3092\u53C2\u71
|
||||
|
||||
# ClickHouseのソースコードを参照 {#browse-clickhouse-source-code}
|
||||
|
||||
を使用することができ **Woboq** オンラインのコードブラウザをご利用 [ここに](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/index.html). このコードナビゲーションや意味のハイライト表示、検索インデックス. コードのスナップショットは随時更新中です。
|
||||
を使用することができ **Woboq** オンラインのコードブラウザをご利用 [ここに](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/index.html). このコードナビゲーションや意味のハイライト表示、検索インデックス. コードのスナップショットは随時更新中です。
|
||||
|
||||
また、ソースを閲覧することもできます [GitHub](https://github.com/ClickHouse/ClickHouse) いつものように
|
||||
|
||||
|
@ -17,7 +17,7 @@ toc_title: "ClickHouse\u30C6\u30B9\u30C8\u3092\u5B9F\u884C\u3059\u308B\u65B9\u6C
|
||||
|
||||
それぞれの試験できるの種類: `.sql` と `.sh`. `.sql` testは、パイプ処理される単純なSQLスクリプトです `clickhouse-client --multiquery --testmode`. `.sh` テストは、単独で実行されるスクリプトです。
|
||||
|
||||
すべてのテストを実行するには、 `testskhouse-test` ツール。 見て! `--help` 可能なオプションのリストについて。 できるだけ実行すべての試験または実行のサブセットの試験フィルター部分文字列の試験名: `./clickhouse-test substring`.
|
||||
すべてのテストを実行するには、 `clickhouse-test` ツール。 見て! `--help` 可能なオプションのリストについて。 できるだけ実行すべての試験または実行のサブセットの試験フィルター部分文字列の試験名: `./clickhouse-test substring`.
|
||||
|
||||
機能テストを呼び出す最も簡単な方法は、コピーすることです `clickhouse-client` に `/usr/bin/`、実行 `clickhouse-server` そして、実行 `./clickhouse-test` 独自のディレクトリから。
|
||||
|
||||
@ -36,13 +36,13 @@ toc_title: "ClickHouse\u30C6\u30B9\u30C8\u3092\u5B9F\u884C\u3059\u308B\u65B9\u6C
|
||||
|
||||
## 既知のバグ {#known-bugs}
|
||||
|
||||
機能テストで簡単に再現できるいくつかのバグを知っていれば、準備された機能テストを `queries/bugs` ディレクトリ。 これらのテストはに移動されます `teststests_stateless` バグが修正されたとき。
|
||||
機能テストで簡単に再現できるいくつかのバグを知っていれば、準備された機能テストを `tests/queries/bugs` ディレクトリ。 これらのテストはに移動されます `tests/queries/0_stateless` バグが修正されたとき。
|
||||
|
||||
## 統合テスト {#integration-tests}
|
||||
|
||||
統合テストでは、クラスター化された設定でclickhouseをテストし、mysql、postgres、mongodbのような他のサーバーとのclickhouseの相互作用を可能にします。 それらはネットワークの割れ目、包みの低下、等を競争して有用である。 これらの試験する方向に作用しdockerを複数の容器を様々なソフトウェアです。
|
||||
|
||||
見る `testsgration/README.md` これらのテストを実行する方法について。
|
||||
見る `tests/integration/README.md` これらのテストを実行する方法について。
|
||||
|
||||
ClickHouseとサードパーティドライバの統合はテストされていません。 また、現在、JDBCおよびODBCドライバとの統合テストはありません。
|
||||
|
||||
|
@ -63,4 +63,10 @@ ClickHouseには、精度を犠牲にしてパフォーマンスを得るため
|
||||
|
||||
詳細については、[データ複製](../engines/table_engines/mergetree_family/replication.md) セクションを参照してください。
|
||||
|
||||
## 欠点と考えられるClickHouseの機能 {#qian-dian-tokao-erareruclickhousenoji-neng}
|
||||
|
||||
1. 本格的なトランザクションはありません。
|
||||
2. 既に挿入されたデータの変更または削除を、高頻度かつ低遅延に行う機能はありません。 [GDPR](https://gdpr-info.eu)に準拠するなど、データをクリーンアップまたは変更するために、バッチ削除およびバッチ更新が利用可能です。
|
||||
3. インデックスが疎であるため、ClickHouseは、キーで単一行を取得するようなクエリにはあまり適していません。
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/introduction/distinctive_features/) <!--hide-->
|
||||
|
@ -1,12 +0,0 @@
|
||||
---
|
||||
toc_priority: 5
|
||||
toc_title: 欠点と見なすことができるClickHouseの機能
|
||||
---
|
||||
|
||||
# 欠点と考えられるClickHouseの機能 {#qian-dian-tokao-erareruclickhousenoji-neng}
|
||||
|
||||
1. 本格的なトランザクションはありません。
|
||||
2. 既に挿入されたデータの変更または削除を、高頻度かつ低遅延に行う機能はありません。 [GDPR](https://gdpr-info.eu)に準拠するなど、データをクリーンアップまたは変更するために、バッチ削除およびバッチ更新が利用可能です。
|
||||
3. インデックスが疎であるため、ClickHouseは、キーで単一行を取得するようなクエリにはあまり適していません。
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/introduction/features_considered_disadvantages/) <!--hide-->
|
@ -249,7 +249,7 @@ toc_title: '2020'
|
||||
- Clickhouseテストスクリプトでハングクエリのチェックを更新 [\#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz))
|
||||
- リポジトリか [\#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
- から数学perftestsの変更タイプ `once` に `loop`. [\#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||
- 追加docker画像を構築ィコードのブラウザのhtmlレポート当社のコードベース. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin))見る [Woboqコードブラウザ](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
- 追加docker画像を構築ィコードのブラウザのhtmlレポート当社のコードベース. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin))見る [Woboqコードブラウザ](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
- MSanの下でいくつかのテストの失敗を抑制. [\#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm))
|
||||
- スピードアップ “exception while insert” テスト。 このテス [\#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
- 更新 `libcxx` と `libcxxabi` マスターに。 準備のために [\#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [\#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
|
@ -98,6 +98,7 @@ functions/ym_dict_functions.md query_language/functions/ym_dict_functions.md
|
||||
interfaces/http_interface.md interfaces/http.md
|
||||
interfaces/third-party_client_libraries.md interfaces/third-party/client_libraries.md
|
||||
interfaces/third-party_gui.md interfaces/third-party/gui.md
|
||||
introduction/features_considered_disadvantages.md introduction/distinctive_features.md
|
||||
introduction/possible_silly_questions.md faq/general.md
|
||||
introduction/ya_metrika_task.md introduction/history.md
|
||||
operations/performance/sampling_query_profiler.md operations/optimizing_performance/sampling_query_profiler.md
|
||||
|
@ -1,201 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Обзор архитектуры ClickHouse {#overview-of-clickhouse-architecture}
|
||||
|
||||
ClickHouse-это настоящая СУБД, ориентированная на столбцы. Данные хранятся столбцами и во время выполнения массивов (векторов или кусков столбцов). Когда это возможно, операции отправляются на массивы, а не на отдельные значения. Это называется «vectorized query execution,» и это помогает снизить стоимость фактической обработки данных.
|
||||
|
||||
> В этой идее нет ничего нового. Она восходит к тому времени, когда `APL` язык программирования и его потомки: `A +`, `J`, `K`, и `Q`. Массивное программирование используется в научной обработке данных. Эта идея также не является чем-то новым в реляционных базах данных: например, она используется в `Vectorwise` система.
|
||||
|
||||
Существует два различных подхода для ускорения обработки запросов: векторизованное выполнение запросов и генерация кода во время выполнения. Последнее устраняет все косвенные действия и динамическую диспетчеризацию. Ни один из этих подходов не является строго лучшим, чем другой. Генерация кода во время выполнения может быть лучше, когда он объединяет множество операций, таким образом полностью используя исполнительные блоки процессора и конвейер. Векторизованное выполнение запроса может быть менее практичным, поскольку оно включает временные векторы, которые должны быть записаны в кэш и считаны обратно. Если временные данные не помещаются в кэш L2, это становится проблемой. Но векторизованное выполнение запросов более легко использует возможности SIMD центрального процессора. Один [научная статья](http://15721.courses.cs.cmu.edu/spring2016/papers/p5-sompolski.pdf) написанное нашими друзьями показывает, что лучше сочетать оба подхода. ClickHouse использует векторизованное выполнение запросов и имеет ограниченную начальную поддержку для генерации кода во время выполнения.
|
||||
|
||||
## Столбцы {#columns}
|
||||
|
||||
`IColumn` интерфейс используется для представления столбцов в памяти (собственно, кусков столбцов). Этот интерфейс предоставляет вспомогательные методы для реализации различных реляционных операторов. Почти все операции неизменяемы: они не изменяют исходный столбец, а создают новый измененный. Например, в `IColumn :: filter` метод принимает маску байта фильтра. Он используется для `WHERE` и `HAVING` реляционный оператор. Дополнительные примеры: `IColumn :: permute` способ поддержки `ORDER BY`, этот `IColumn :: cut` способ поддержки `LIMIT`.
|
||||
|
||||
Различный `IColumn` реализации (`ColumnUInt8`, `ColumnString`, и так далее) отвечают за расположение столбцов в памяти. Расположение памяти обычно представляет собой непрерывный массив. Для целочисленного типа столбцов это всего лишь один непрерывный массив, например `std :: vector`. Для `String` и `Array` столбцы, это два вектора: один для всех элементов массива, расположенных последовательно, и второй для смещений к началу каждого массива. Существует также `ColumnConst` это сохраняет только одно значение в памяти, но выглядит как столбец.
|
||||
|
||||
## Поле {#field}
|
||||
|
||||
Тем не менее, можно работать и с индивидуальными ценностями. Чтобы представить индивидуальную ценность, то `Field` предназначенный. `Field` это просто дискриминированный Союз `UInt64`, `Int64`, `Float64`, `String` и `Array`. `IColumn` имеет `operator[]` метод получения n-го значения в виде a `Field` и `insert` способ, чтобы добавить `Field` до самого конца колонны. Эти методы не очень эффективны, потому что они требуют решения временных проблем `Field` объекты, представляющие индивидуальную ценность. Существуют и более эффективные методы, такие как `insertFrom`, `insertRangeFrom` и так далее.
|
||||
|
||||
`Field` у него нет достаточной информации о конкретном типе данных для таблицы. Например, `UInt8`, `UInt16`, `UInt32`, и `UInt64` все они представлены в виде `UInt64` в `Field`.
|
||||
|
||||
## Дырявые абстракции {#leaky-abstractions}
|
||||
|
||||
`IColumn` есть методы для общих реляционных преобразований данных, но они не удовлетворяют всем потребностям. Например, `ColumnUInt64` не имеет метода для вычисления суммы двух столбцов, и `ColumnString` у него нет метода для запуска поиска по подстрокам. Эти бесчисленные процедуры реализуются за пределами `IColumn`.
|
||||
|
||||
Различные функции на столбцах могут быть реализованы общим, неэффективным способом с использованием `IColumn` способы извлечения `Field` значения, или специализированным способом, использующим знание внутренней компоновки памяти данных в определенном месте. `IColumn` реализация. Он реализуется путем приведения функций к определенному виду `IColumn` тип и дело с внутренним представлением непосредственно. Например, `ColumnUInt64` имеет `getData` метод, который возвращает ссылку на внутренний массив, а затем отдельная процедура считывает или заполняет этот массив непосредственно. У нас есть «leaky abstractions» чтобы обеспечить эффективную специализацию различных процедур.
|
||||
|
||||
## Тип данных {#data_types}
|
||||
|
||||
`IDataType` отвечает за сериализацию и десериализацию: чтение и запись фрагментов столбцов или отдельных значений в двоичной или текстовой форме. `IDataType` непосредственно соответствует типам данных в таблицах. Например, существуют `DataTypeUInt32`, `DataTypeDateTime`, `DataTypeString` и так далее.
|
||||
|
||||
`IDataType` и `IColumn` они лишь слабо связаны друг с другом. Различные типы данных могут быть представлены в памяти одним и тем же именем `IColumn` реализации. Например, `DataTypeUInt32` и `DataTypeDateTime` оба они представлены следующим образом `ColumnUInt32` или `ColumnConstUInt32`. Кроме того, один и тот же тип данных может быть представлен разными `IColumn` реализации. Например, `DataTypeUInt8` может быть представлен следующим образом `ColumnUInt8` или `ColumnConstUInt8`.
|
||||
|
||||
`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранит вообще ничего (кроме vptr) и `DataTypeFixedString` магазины просто `N` (размер строк фиксированного размера).
|
||||
|
||||
`IDataType` имеет вспомогательные методы для различных форматов данных. Примерами являются методы сериализации значения с возможным цитированием, сериализации значения для JSON и сериализации значения в формате XML. Прямого соответствия форматам данных не существует. Например, различные форматы данных `Pretty` и `TabSeparated` можно использовать то же самое `serializeTextEscaped` вспомогательный метод от `IDataType` интерфейс.
|
||||
|
||||
## Блок {#block}
|
||||
|
||||
A `Block` это контейнер, представляющий подмножество (фрагмент) таблицы в памяти. Это всего лишь набор троек: `(IColumn, IDataType, column name)`. Во время выполнения запроса данные обрабатываются с помощью `Block`s. Если у нас есть `Block`, у нас есть данные (в `IColumn` объект), у нас есть информация о его типе (в `IDataType`) это говорит нам, как обращаться с этим столбцом, и у нас есть имя столбца. Это может быть либо исходное имя столбца из таблицы, либо какое-то искусственное имя, назначенное для получения временных результатов вычислений.
|
||||
|
||||
Когда мы вычисляем некоторую функцию по столбцам в блоке, мы добавляем другой столбец с его результатом в блок, и мы не касаемся столбцов для аргументов функции, потому что операции неизменяемы. Позже ненужные столбцы могут быть удалены из блока, но не изменены. Это удобно для исключения общих подвыражений.
|
||||
|
||||
Блоки создаются для каждого обработанного фрагмента данных. Обратите внимание, что для одного и того же типа вычисления имена столбцов и типы остаются одинаковыми для разных блоков, и изменяются только данные столбцов. Лучше разделить данные блока из заголовка блока, потому что небольшие размеры блока имеют высокую нагрузку временных строк для копирования shared\_ptrs и имен столбцов.
|
||||
|
||||
## Блокировать Потоки {#block-streams}
|
||||
|
||||
Блочные потоки предназначены для обработки данных. Мы используем потоки блоков для чтения данных откуда-то, выполнения преобразований данных или записи данных куда-то. `IBlockInputStream` имеет `read` метод для извлечения следующего блока, пока он доступен. `IBlockOutputStream` имеет `write` метод, чтобы подтолкнуть блок куда-то.
|
||||
|
||||
Потоки отвечают за:
|
||||
|
||||
1. Чтение или письмо за столом. Таблица просто возвращает поток для чтения или записи блоков.
|
||||
2. Реализация форматов данных. Например, если вы хотите вывести данные на терминал в `Pretty` форматирование, вы создаете поток вывода блока, где вы толкаете блоки, и он форматирует их.
|
||||
3. Выполнение преобразований данных. Скажем так у вас есть `IBlockInputStream` и хотите создать отфильтрованный поток. Вы создаете `FilterBlockInputStream` и инициализируйте его с помощью своего потока. Затем, когда вы вытащите блок из `FilterBlockInputStream`, он извлекает блок из вашего потока, фильтрует его и возвращает отфильтрованный блок вам. Конвейеры выполнения запросов представлены таким образом.
|
||||
|
||||
Есть и более сложные трансформации. Например, когда вы тянете из `AggregatingBlockInputStream`, он считывает все данные из своего источника, агрегирует их, а затем возвращает поток агрегированных данных для вас. Еще пример: `UnionBlockInputStream` принимает множество источников ввода в конструкторе, а также ряд потоков. Он запускает несколько потоков и читает из нескольких источников параллельно.
|
||||
|
||||
> Потоки блокируют использовать «pull» подход к управлению потоком: когда вы вытягиваете блок из первого потока, он, следовательно, вытягивает необходимые блоки из вложенных потоков, и весь конвейер выполнения будет работать. Ни «pull» ни «push» это лучшее решение, потому что поток управления является неявным, и это ограничивает реализацию различных функций, таких как одновременное выполнение нескольких запросов (объединение многих конвейеров вместе). Это ограничение может быть преодолено с помощью сопрограмм или просто запуском дополнительных потоков, которые ждут друг друга. У нас может быть больше возможностей, если мы сделаем поток управления явным: если мы найдем логику для передачи данных из одной расчетной единицы в другую вне этих расчетных единиц. Читать это [статья](http://journal.stuffwithstuff.com/2013/01/13/iteration-inside-and-out/) для новых мыслей.
|
||||
|
||||
Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся держать размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в трубопроводе вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у него также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, кражу промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов.
|
||||
|
||||
## Форматы {#formats}
|
||||
|
||||
Форматы данных реализуются с помощью блочных потоков. Есть «presentational» форматы, пригодные только для вывода данных клиенту, такие как `Pretty` формат, который предоставляет только `IBlockOutputStream`. И есть форматы ввода/вывода, такие как `TabSeparated` или `JSONEachRow`.
|
||||
|
||||
Существуют также потоки подряд : `IRowInputStream` и `IRowOutputStream`. Они позволяют вытягивать / выталкивать данные отдельными строками, а не блоками. И они нужны только для упрощения реализации ориентированных на строки форматов. Обертка `BlockInputStreamFromRowInputStream` и `BlockOutputStreamFromRowOutputStream` позволяет конвертировать потоки, ориентированные на строки, в обычные потоки, ориентированные на блоки.
|
||||
|
||||
## I/O {#io}
|
||||
|
||||
Для байт-ориентированных входов / выходов существуют `ReadBuffer` и `WriteBuffer` абстрактный класс. Они используются вместо C++ `iostream`s. Не волнуйтесь: каждый зрелый проект C++ использует что-то другое, чем `iostream`s по уважительным причинам.
|
||||
|
||||
`ReadBuffer` и `WriteBuffer` это просто непрерывный буфер и курсор, указывающий на позицию в этом буфере. Реализации могут владеть или не владеть памятью для буфера. Существует виртуальный метод заполнения буфера следующими данными (для `ReadBuffer`) или смыть буфер куда-нибудь (например `WriteBuffer`). Виртуальные методы редко вызываются.
|
||||
|
||||
Реализация следующих принципов: `ReadBuffer`/`WriteBuffer` используются для работы с файлами и файловыми дескрипторами, а также сетевыми сокетами, для реализации сжатия (`CompressedWriteBuffer` is initialized with another WriteBuffer and performs compression before writing data to it), and for other purposes – the names `ConcatReadBuffer`, `LimitReadBuffer`, и `HashingWriteBuffer` за себя говорить.
|
||||
|
||||
Буферы чтения/записи имеют дело только с байтами. Есть функции от `ReadHelpers` и `WriteHelpers` заголовочные файлы, чтобы помочь с форматированием ввода / вывода. Например, есть помощники для записи числа в десятичном формате.
|
||||
|
||||
Давайте посмотрим, что происходит, когда вы хотите написать результирующий набор в `JSON` форматирование в stdout. У вас есть результирующий набор, готовый к извлечению из него `IBlockInputStream`. Вы создаете `WriteBufferFromFileDescriptor(STDOUT_FILENO)` чтобы записать байты в stdout. Вы создаете `JSONRowOutputStream`, инициализируется с помощью этого `WriteBuffer`, чтобы записать строки в `JSON` в stdout. Вы создаете `BlockOutputStreamFromRowOutputStream` кроме того, чтобы представить его как `IBlockOutputStream`. А потом ты позвонишь `copyData` для передачи данных из `IBlockInputStream` к `IBlockOutputStream` и все это работает. Внутренне, `JSONRowOutputStream` буду писать в формате JSON различные разделители и вызвать `IDataType::serializeTextJSON` метод со ссылкой на `IColumn` и номер строки в качестве аргументов. Следовательно, `IDataType::serializeTextJSON` вызовет метод из `WriteHelpers.h`: например, `writeText` для числовых типов и `writeJSONString` для `DataTypeString`.
|
||||
|
||||
## Таблицы {#tables}
|
||||
|
||||
То `IStorage` интерфейс представляет собой таблицы. Различные реализации этого интерфейса являются различными движками таблиц. Примеры `StorageMergeTree`, `StorageMemory` и так далее. Экземпляры этих классов являются просто таблицами.
|
||||
|
||||
Ключ `IStorage` методы `read` и `write`. Есть и другие варианты `alter`, `rename`, `drop` и так далее. То `read` метод принимает следующие аргументы: набор столбцов для чтения из таблицы, набор столбцов для чтения из таблицы. `AST` запрос для рассмотрения и желаемое количество потоков для возврата. Он возвращает один или несколько `IBlockInputStream` объекты и информация о стадии обработки данных, которая была завершена внутри табличного движка во время выполнения запроса.
|
||||
|
||||
В большинстве случаев метод read отвечает только за чтение указанных столбцов из таблицы, а не за дальнейшую обработку данных. Вся дальнейшая обработка данных осуществляется интерпретатором запросов и не входит в сферу ответственности компании `IStorage`.
|
||||
|
||||
Но есть и заметные исключения:
|
||||
|
||||
- Запрос AST передается на сервер `read` метод, и механизм таблиц может использовать его для получения использования индекса и считывания меньшего количества данных из таблицы.
|
||||
- Иногда механизм таблиц может сам обрабатывать данные до определенного этапа. Например, `StorageDistributed` можно отправить запрос на удаленные серверы, попросить их обработать данные на этапе, когда данные с разных удаленных серверов могут быть объединены, и вернуть эти предварительно обработанные данные. Затем интерпретатор запросов завершает обработку данных.
|
||||
|
||||
Стол `read` метод может возвращать несколько значений `IBlockInputStream` объекты, позволяющие осуществлять параллельную обработку данных. Эти несколько блочных входных потоков могут считываться из таблицы параллельно. Затем вы можете обернуть эти потоки с помощью различных преобразований (таких как вычисление выражений или фильтрация), которые могут быть вычислены независимо, и создать `UnionBlockInputStream` поверх них, чтобы читать из нескольких потоков параллельно.
|
||||
|
||||
Есть и другие варианты `TableFunction`s. Это функции, которые возвращают временное значение `IStorage` объект для использования в `FROM` предложение запроса.
|
||||
|
||||
Чтобы получить быстрое представление о том, как реализовать свой движок таблиц, посмотрите на что-то простое, например `StorageMemory` или `StorageTinyLog`.
|
||||
|
||||
> В результате этого `read` метод, `IStorage` возвращается `QueryProcessingStage` – information about what parts of the query were already calculated inside storage.
|
||||
|
||||
## Синтаксический анализатор {#parsers}
|
||||
|
||||
Написанный от руки рекурсивный парсер спуска анализирует запрос. Например, `ParserSelectQuery` просто рекурсивно вызывает базовые Парсеры для различных частей запроса. Парсеры создают `AST`. То `AST` представлен узлами, которые являются экземплярами `IAST`.
|
||||
|
||||
> Генераторы парсеров не используются по историческим причинам.
|
||||
|
||||
## Переводчики {#interpreters}
|
||||
|
||||
Интерпретаторы отвечают за создание конвейера выполнения запроса из `AST`. Есть простые переводчики, такие как `InterpreterExistsQuery` и `InterpreterDropQuery` или более изощренные `InterpreterSelectQuery`. Конвейер выполнения запроса представляет собой комбинацию блочных входных и выходных потоков. Например, результат интерпретации `SELECT` запросов `IBlockInputStream` для чтения результирующего набора из; результат запроса INSERT - это `IBlockOutputStream` чтобы записать данные для вставки в, и результат интерпретации `INSERT SELECT` запросов `IBlockInputStream` это возвращает пустой результирующий набор при первом чтении, но копирует данные из него `SELECT` к `INSERT` в то же время.
|
||||
|
||||
`InterpreterSelectQuery` использует `ExpressionAnalyzer` и `ExpressionActions` машины для анализа запросов и преобразований. Именно здесь выполняется большинство оптимизаций запросов на основе правил. `ExpressionAnalyzer` это довольно грязно и должно быть переписано: различные преобразования запросов и оптимизации должны быть извлечены в отдельные классы, чтобы позволить модульные преобразования или запрос.
|
||||
|
||||
## Функции {#functions}
|
||||
|
||||
Существуют обычные функции и агрегатные функции. Агрегатные функции см. В следующем разделе.
|
||||
|
||||
Ordinary functions don’t change the number of rows – they work as if they are processing each row independently. In fact, functions are not called for individual rows, but for `Block`’s данных для реализации векторизованного выполнения запросов.
|
||||
|
||||
Есть некоторые другие функции, такие как [размер блока](../sql_reference/functions/other_functions.md#function-blocksize), [роунумберинблок](../sql_reference/functions/other_functions.md#function-rownumberinblock), и [runningAccumulate](../sql_reference/functions/other_functions.md#function-runningaccumulate), которые эксплуатируют обработку блоков и нарушают независимость строк.
|
||||
|
||||
ClickHouse имеет сильную типизацию, поэтому нет никакого неявного преобразования типов. Если функция не поддерживает определенную комбинацию типов, она создает исключение. Но функции могут работать (перегружаться) для многих различных комбинаций типов. Например, в `plus` функция (для реализации `+` оператор) работает для любой комбинации числовых типов: `UInt8` + `Float32`, `UInt16` + `Int8` и так далее. Кроме того, некоторые вариадические функции могут принимать любое количество аргументов, например `concat` функция.
|
||||
|
||||
Реализация функции может быть немного неудобной, поскольку функция явно отправляет поддерживаемые типы данных и поддерживается `IColumns`. Например, в `plus` функция имеет код, генерируемый экземпляром шаблона C++ для каждой комбинации числовых типов, а также постоянные или непостоянные левые и правые аргументы.
|
||||
|
||||
Это отличное место для реализации генерации кода во время выполнения, чтобы избежать раздувания кода шаблона. Кроме того, он позволяет добавлять слитые функции, такие как fused multiply-add или выполнять несколько сравнений в одной итерации цикла.
|
||||
|
||||
Из-за векторизованного выполнения запроса функции не закорачиваются. Например, если вы пишете `WHERE f(x) AND g(y)`, обе стороны вычисляются, даже для строк, когда `f(x)` равно нулю (за исключением тех случаев, когда `f(x)` является нулевым постоянным выражением). Но если избирательность самого `f(x)` состояние является высоким, и расчет `f(x)` это гораздо дешевле, чем `g(y)`, лучше всего реализовать многоходовой расчет. Это будет первый расчет `f(x)`, затем отфильтруйте столбцы по результату, а затем вычислите `g(y)` только для небольших отфильтрованных фрагментов данных.
|
||||
|
||||
## Статистическая функция {#aggregate-functions}
|
||||
|
||||
Агрегатные функции - это функции, определяющие состояние. Они накапливают переданные значения в некотором состоянии и позволяют получать результаты из этого состояния. Они управляются с помощью `IAggregateFunction` интерфейс. Состояния могут быть довольно простыми (состояние для `AggregateFunctionCount` это всего лишь один человек `UInt64` значение) или довольно сложное (состояние `AggregateFunctionUniqCombined` представляет собой комбинацию линейного массива, хэш-таблицы и `HyperLogLog` вероятностная структура данных).
|
||||
|
||||
Государства распределяются в `Arena` (пул памяти) для работы с несколькими состояниями при выполнении высокой мощности `GROUP BY` запрос. Состояния могут иметь нетривиальный конструктор и деструктор: например, сложные агрегатные состояния могут сами выделять дополнительную память. Это требует некоторого внимания к созданию и уничтожению государств и правильной передаче их права собственности и порядка уничтожения.
|
||||
|
||||
Агрегатные состояния могут быть сериализованы и десериализованы для передачи по сети во время выполнения распределенного запроса или для записи их на диск, где недостаточно оперативной памяти. Они даже могут храниться в таблице с `DataTypeAggregateFunction` чтобы разрешить инкрементное агрегирование данных.
|
||||
|
||||
> Сериализованный формат данных для состояний агрегатных функций в настоящее время не является версионным. Это нормально, если агрегатные состояния хранятся только временно. Но у нас есть такая возможность `AggregatingMergeTree` механизм таблиц для инкрементного агрегирования, и люди уже используют его в производстве. Именно по этой причине обратная совместимость требуется при изменении сериализованного формата для любой агрегатной функции в будущем.
|
||||
|
||||
## Сервер {#server}
|
||||
|
||||
Сервер реализует несколько различных интерфейсов:
|
||||
|
||||
- Интерфейс HTTP для любых иностранных клиентов.
|
||||
- TCP-интерфейс для собственного клиента ClickHouse и для межсерверной связи во время выполнения распределенного запроса.
|
||||
- Интерфейс для передачи данных для репликации.
|
||||
|
||||
Внутренне это просто примитивный многопоточный сервер без сопрограмм или волокон. Поскольку сервер предназначен не для обработки высокой скорости простых запросов, а для обработки относительно низкой скорости сложных запросов, каждый из них может обрабатывать огромное количество данных для аналитики.
|
||||
|
||||
Сервер инициализирует программу `Context` класс с необходимой средой для выполнения запроса: список доступных баз данных, пользователей и прав доступа, настройки, кластеры, список процессов, журнал запросов и так далее. Переводчики используют эту среду.
|
||||
|
||||
Мы поддерживаем полную обратную и прямую совместимость для протокола TCP сервера: старые клиенты могут разговаривать с новыми серверами, а новые клиенты-со старыми серверами. Но мы не хотим поддерживать его вечно, и мы удаляем поддержку старых версий примерно через год.
|
||||
|
||||
!!! note "Примечание"
|
||||
Для большинства внешних приложений мы рекомендуем использовать интерфейс HTTP, поскольку он прост и удобен в использовании. Протокол TCP более тесно связан с внутренними структурами данных: он использует внутренний формат для передачи блоков данных, а также использует пользовательское обрамление для сжатых данных. Мы не выпустили библиотеку C для этого протокола, потому что она требует связывания большей части кодовой базы ClickHouse, что нецелесообразно.
|
||||
|
||||
## Выполнение Распределенных Запросов {#distributed-query-execution}
|
||||
|
||||
Серверы в кластерной установке в основном независимы. Вы можете создать `Distributed` таблица на одном или всех серверах кластера. То `Distributed` table does not store data itself – it only provides a «view» ко всем локальным таблицам на нескольких узлах кластера. Когда вы выберите из `Distributed` таблица, он переписывает этот запрос, выбирает удаленные узлы в соответствии с настройками балансировки нагрузки и отправляет запрос к ним. То `Distributed` таблица запрашивает удаленные серверы для обработки запроса только до стадии, когда промежуточные результаты с разных серверов могут быть объединены. Затем он получает промежуточные результаты и сливает их. Распределенная таблица пытается распределить как можно больше работы на удаленные серверы и не отправляет много промежуточных данных по сети.
|
||||
|
||||
Все становится сложнее, когда у вас есть подзапросы в предложениях IN или JOIN, и каждый из них использует a `Distributed` стол. У нас есть разные стратегии выполнения этих запросов.
|
||||
|
||||
Глобального плана запросов для выполнения распределенных запросов не существует. Каждый узел имеет свой локальный план запроса для своей части задания. У нас есть только простое однопроходное распределенное выполнение запросов: мы отправляем запросы на удаленные узлы, а затем объединяем результаты. Но это неосуществимо для сложных запросов с высокой мощностью группы BYs или с большим количеством временных данных для соединения. В таких случаях нам необходимо: «reshuffle» данные между серверами, что требует дополнительной координации. ClickHouse не поддерживает такого рода выполнение запросов, и мы должны работать над этим.
|
||||
|
||||
## Дерево Слияния {#merge-tree}
|
||||
|
||||
`MergeTree` это семейство механизмов хранения данных, поддерживающих индексацию по первичному ключу. Первичный ключ может быть произвольным кортежем столбцов или выражений. Данные в a `MergeTree` таблица хранится в «parts». Каждая часть хранит данные в порядке первичного ключа, поэтому данные лексикографически упорядочиваются кортежем первичного ключа. Все столбцы таблицы хранятся отдельно `column.bin` файлы в этих краях. Файлы состоят из сжатых блоков. Каждый блок обычно содержит от 64 КБ до 1 МБ несжатых данных, в зависимости от среднего размера значения. Блоки состоят из значений столбцов, расположенных последовательно друг за другом. Значения столбцов находятся в одном и том же порядке для каждого столбца (первичный ключ определяет порядок), поэтому при итерации по многим столбцам вы получаете значения для соответствующих строк.
|
||||
|
||||
Сам первичный ключ является «sparse». Он адресует не каждую отдельную строку, а только некоторые диапазоны данных. Разделение `primary.idx` файл имеет значение первичного ключа для каждой N-й строки, где N называется `index_granularity` (обычно N = 8192). Кроме того, для каждой колонки у нас есть `column.mrk` файлы с «marks,» которые являются смещениями для каждой N-й строки в файле данных. Каждая метка представляет собой пару: смещение в файле к началу сжатого блока и смещение в распакованном блоке к началу данных. Обычно сжатые блоки выравниваются по меткам, а смещение в распакованном блоке равно нулю. Данные для `primary.idx` всегда находится в памяти, а данные для `column.mrk` файлы кэшируются.
|
||||
|
||||
Когда мы собираемся прочитать что-то из части в `MergeTree`, мы смотрим на `primary.idx` данные и найдите диапазоны, которые могут содержать запрошенные данные, а затем посмотрите на `column.mrk` данные и рассчитать смещения для того, чтобы начать чтение этих диапазонов. Из-за разреженности могут быть прочитаны избыточные данные. ClickHouse не подходит для высокой загрузки простых точечных запросов, так как весь диапазон с `index_granularity` строки должны быть прочитаны для каждого ключа, и весь сжатый блок должен быть распакован для каждого столбца. Мы сделали индекс разреженным, потому что мы должны быть в состоянии поддерживать триллионы строк на одном сервере без заметного потребления памяти для индекса. Кроме того, поскольку первичный ключ разрежен, он не является уникальным: он не может проверить существование ключа в таблице во время вставки. В таблице может быть много строк с одним и тем же ключом.
|
||||
|
||||
Когда вы `INSERT` куча данных в `MergeTree`, эта связка сортируется по порядку первичного ключа и образует новую часть. Существуют фоновые потоки, которые периодически выделяют некоторые детали и объединяют их в одну сортированную деталь, чтобы сохранить количество деталей относительно низким. Вот почему он так называется `MergeTree`. Конечно, слияние приводит к тому, что «write amplification». Все части неизменны: они только создаются и удаляются, но не изменяются. Когда SELECT выполняется, он содержит снимок таблицы (набор деталей). После слияния мы также сохраняем старые детали в течение некоторого времени, чтобы облегчить восстановление после сбоя, поэтому, если мы видим, что какая-то объединенная деталь, вероятно, сломана, мы можем заменить ее исходными частями.
|
||||
|
||||
`MergeTree` это не дерево LSM, потому что оно не содержит «memtable» и «log»: inserted data is written directly to the filesystem. This makes it suitable only to INSERT data in batches, not by individual row and not very frequently – about once per second is ok, but a thousand times a second is not. We did it this way for simplicity’s sake, and because we are already inserting data in batches in our applications.
|
||||
|
||||
> Таблицы MergeTree могут иметь только один (первичный) индекс: вторичных индексов не существует. Было бы неплохо разрешить несколько физических представлений в одной логической таблице, например, хранить данные в более чем одном физическом порядке или даже разрешить представления с предварительно агрегированными данными наряду с исходными данными.
|
||||
|
||||
Есть движки MergeTree, которые выполняют дополнительную работу во время фоновых слияний. Примеры `CollapsingMergeTree` и `AggregatingMergeTree`. Это можно рассматривать как специальную поддержку обновлений. Имейте в виду, что это не настоящие обновления, поскольку пользователи обычно не имеют никакого контроля над временем выполнения фоновых слияний, а данные в `MergeTree` таблица почти всегда хранится в нескольких частях, а не в полностью объединенном виде.
|
||||
|
||||
## Копирование {#replication}
|
||||
|
||||
Репликация в ClickHouse может быть настроена на основе каждой таблицы. Вы можете иметь некоторые реплицированные и некоторые нереплицированные таблицы на одном сервере. Вы также можете иметь таблицы, реплицируемые различными способами,например, одна таблица с двухфакторной репликацией, а другая-с трехфакторной.
|
||||
|
||||
Репликация осуществляется в виде `ReplicatedMergeTree` подсистема хранилища. Путь в `ZooKeeper` указывается в качестве параметра для механизма хранения данных. Все таблицы с одинаковым путем внутри `ZooKeeper` становятся репликами друг друга: они синхронизируют свои данные и поддерживают согласованность. Реплики можно добавлять и удалять динамически, просто создавая или удаляя таблицу.
|
||||
|
||||
Репликация использует асинхронную многомастерную схему. Вы можете вставить данные в любую реплику, которая имеет сеанс с `ZooKeeper`, и данные реплицируются во все остальные реплики асинхронно. Поскольку ClickHouse не поддерживает обновления, репликация является бесконфликтной. Поскольку нет подтверждения кворума вставок, только что вставленные данные могут быть потеряны, если один узел выйдет из строя.
|
||||
|
||||
Метаданные для репликации хранятся в ZooKeeper. Существует журнал репликации, в котором перечислены необходимые действия. Действия таковы: получить часть; объединить части; удалить раздел и так далее. Каждая реплика копирует журнал репликации в свою очередь, а затем выполняет действия из этой очереди. Например, при вставке «get the part» действие создается в журнале, и каждая реплика загружает эту часть. Слияния координируются между репликами для получения идентичных байтам результатов. Все части объединяются одинаково на всех репликах. Это достигается путем выбора одной реплики в качестве лидера, и эта реплика инициирует слияние и запись «merge parts» действия по ведению журнала.
|
||||
|
||||
Репликация является физической: между узлами передаются только сжатые части, а не запросы. Слияния обрабатываются на каждой реплике независимо в большинстве случаев, чтобы снизить затраты на сеть, избегая усиления сети. Большие объединенные части передаются по сети только в случаях значительного запаздывания репликации.
|
||||
|
||||
Кроме того, каждая реплика хранит свое состояние в ZooKeeper как набор деталей и их контрольные суммы. Когда состояние локальной файловой системы отличается от эталонного состояния в ZooKeeper, реплика восстанавливает свою согласованность, загружая недостающие и сломанные части из других реплик. Когда в локальной файловой системе появляются неожиданные или неработающие данные, ClickHouse не удаляет их, а перемещает в отдельный каталог и забывает.
|
||||
|
||||
!!! note "Примечание"
|
||||
Кластер ClickHouse состоит из независимых сегментов, и каждый сегмент состоит из реплик. Кластер таков **неупругий**, поэтому после добавления нового осколка данные не будут автоматически перебалансированы между осколками. Вместо этого предполагается, что нагрузка на кластер будет регулироваться неравномерно. Эта реализация дает вам больше контроля, и это нормально для относительно небольших кластеров, таких как десятки узлов. Но для кластеров с сотнями узлов, которые мы используем в производстве, этот подход становится существенным недостатком. Мы должны реализовать механизм таблиц, который охватывает весь кластер с динамически реплицируемыми областями, которые могут быть разделены и сбалансированы между кластерами автоматически.
|
||||
|
||||
{## [Оригинальная статья](https://clickhouse.tech/docs/en/development/architecture/) ##}
|
1
docs/ru/development/architecture.md
Symbolic link
1
docs/ru/development/architecture.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/architecture.md
|
@ -1,6 +1,6 @@
|
||||
# Навигация по коду ClickHouse {#navigatsiia-po-kodu-clickhouse}
|
||||
|
||||
Для навигации по коду онлайн доступен **Woboq**, он расположен [здесь](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/src/index.html). В нём реализовано удобное перемещение между исходными файлами, семантическая подсветка, подсказки, индексация и поиск. Слепок кода обновляется ежедневно.
|
||||
Для навигации по коду онлайн доступен **Woboq**, он расположен [здесь](https://clickhouse.tech/codebrowser/html_report///ClickHouse/src/index.html). В нём реализовано удобное перемещение между исходными файлами, семантическая подсветка, подсказки, индексация и поиск. Слепок кода обновляется ежедневно.
|
||||
|
||||
Также вы можете просматривать исходники на [GitHub](https://github.com/ClickHouse/ClickHouse).
|
||||
|
||||
|
@ -1,139 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Как построить ClickHouse для развития {#how-to-build-clickhouse-for-development}
|
||||
|
||||
Следующий учебник основан на системе Ubuntu Linux.
|
||||
С соответствующими изменениями он также должен работать на любом другом дистрибутиве Linux.
|
||||
Поддерживаемые платформы: x86\_64 и AArch64. Поддержка Power9 является экспериментальной.
|
||||
|
||||
## Установите Git, CMake, Python и Ninja {#install-git-cmake-python-and-ninja}
|
||||
|
||||
``` bash
|
||||
$ sudo apt-get install git cmake python ninja-build
|
||||
```
|
||||
|
||||
Или cmake3 вместо cmake на старых системах.
|
||||
|
||||
## Установка GCC 9 {#install-gcc-9}
|
||||
|
||||
Есть несколько способов сделать это.
|
||||
|
||||
### Установка из PPA пакет {#install-from-a-ppa-package}
|
||||
|
||||
``` bash
|
||||
$ sudo apt-get install software-properties-common
|
||||
$ sudo apt-add-repository ppa:ubuntu-toolchain-r/test
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install gcc-9 g++-9
|
||||
```
|
||||
|
||||
### Установка из источников {#install-from-sources}
|
||||
|
||||
Смотреть на [utils/ci/build-gcc-from-sources.sh](https://github.com/ClickHouse/ClickHouse/blob/master/utils/ci/build-gcc-from-sources.sh)
|
||||
|
||||
## Использовать GCC для сборки 9 {#use-gcc-9-for-builds}
|
||||
|
||||
``` bash
|
||||
$ export CC=gcc-9
|
||||
$ export CXX=g++-9
|
||||
```
|
||||
|
||||
## Проверка Источников ClickHouse {#checkout-clickhouse-sources}
|
||||
|
||||
``` bash
|
||||
$ git clone --recursive git@github.com:ClickHouse/ClickHouse.git
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
``` bash
|
||||
$ git clone --recursive https://github.com/ClickHouse/ClickHouse.git
|
||||
```
|
||||
|
||||
## Построить ClickHouse {#build-clickhouse}
|
||||
|
||||
``` bash
|
||||
$ cd ClickHouse
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake ..
|
||||
$ ninja
|
||||
$ cd ..
|
||||
```
|
||||
|
||||
Чтобы создать исполняемый файл, выполните команду `ninja clickhouse`.
|
||||
Это позволит создать `programs/clickhouse` исполняемый файл, который может быть использован с `client` или `server` аргументы.
|
||||
|
||||
# Как построить ClickHouse на любом Linux {#how-to-build-clickhouse-on-any-linux}
|
||||
|
||||
Для сборки требуются следующие компоненты:
|
||||
|
||||
- Git (используется только для проверки исходных текстов, он не нужен для сборки)
|
||||
- CMake 3.10 или новее
|
||||
- Ниндзя (рекомендуется) или сделать
|
||||
- Компилятор C++: gcc 9 или clang 8 или новее
|
||||
- Компоновщик: lld или gold (классический GNU ld не будет работать)
|
||||
- Python (используется только внутри сборки LLVM и является необязательным)
|
||||
|
||||
Если все компоненты установлены, Вы можете построить их так же, как и описанные выше шаги.
|
||||
|
||||
Пример для Ubuntu Eoan:
|
||||
|
||||
sudo apt update
|
||||
sudo apt install git cmake ninja-build g++ python
|
||||
git clone --recursive https://github.com/ClickHouse/ClickHouse.git
|
||||
mkdir build && cd build
|
||||
cmake ../ClickHouse
|
||||
ninja
|
||||
|
||||
Пример для OpenSUSE перекати-поле:
|
||||
|
||||
sudo zypper install git cmake ninja gcc-c++ python lld
|
||||
git clone --recursive https://github.com/ClickHouse/ClickHouse.git
|
||||
mkdir build && cd build
|
||||
cmake ../ClickHouse
|
||||
ninja
|
||||
|
||||
Пример для сыромятной кожи Fedora:
|
||||
|
||||
sudo yum update
|
||||
yum --nogpg install git cmake make gcc-c++ python2
|
||||
git clone --recursive https://github.com/ClickHouse/ClickHouse.git
|
||||
mkdir build && cd build
|
||||
cmake ../ClickHouse
|
||||
make -j $(nproc)
|
||||
|
||||
# Вам не нужно строить ClickHouse {#you-dont-have-to-build-clickhouse}
|
||||
|
||||
ClickHouse доступен в готовых двоичных файлах и пакетах. Двоичные файлы являются портативными и могут быть запущены на любом вкусе Linux.
|
||||
|
||||
Они созданы для стабильных, предустановленных и тестовых релизов до тех пор, пока для каждого коммита к мастеру и для каждого запроса на вытягивание.
|
||||
|
||||
Чтобы найти самую свежую сборку из `master`, обратиться [совершает страницы](https://github.com/ClickHouse/ClickHouse/commits/master), нажмите на первую зеленую галочку или красный крестик рядом с фиксацией и нажмите на кнопку «Details» ссылка сразу после этого «ClickHouse Build Check».
|
||||
|
||||
# Как создать пакет ClickHouse Debian {#how-to-build-clickhouse-debian-package}
|
||||
|
||||
## Установите Git и Pbuilder {#install-git-and-pbuilder}
|
||||
|
||||
``` bash
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install git python pbuilder debhelper lsb-release fakeroot sudo debian-archive-keyring debian-keyring
|
||||
```
|
||||
|
||||
## Проверка Источников ClickHouse {#checkout-clickhouse-sources-1}
|
||||
|
||||
``` bash
|
||||
$ git clone --recursive --branch master https://github.com/ClickHouse/ClickHouse.git
|
||||
$ cd ClickHouse
|
||||
```
|
||||
|
||||
## Запустить Сценарий Выпуска {#run-release-script}
|
||||
|
||||
``` bash
|
||||
$ ./release
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/development/build/) <!--hide-->
|
1
docs/ru/development/build.md
Symbolic link
1
docs/ru/development/build.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/build.md
|
@ -1,41 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Как построить ClickHouse на Linux для архитектуры AArch64 (ARM64) {#how-to-build-clickhouse-on-linux-for-aarch64-arm64-architecture}
|
||||
|
||||
Это для случая, когда у вас есть Linux-машина и вы хотите использовать ее для сборки `clickhouse` двоичный файл, который будет работать на другой машине Linux с архитектурой процессора AARCH64. Это предназначено для непрерывной проверки интеграции, которая выполняется на серверах Linux.
|
||||
|
||||
Кросс-сборка для AARCH64 основана на следующих принципах: [Инструкции по сборке](build.md)- сначала следуйте за ними.
|
||||
|
||||
# Установка Clang-8 {#install-clang-8}
|
||||
|
||||
Следуйте инструкциям от https://apt.llvm.org/ для вашей установки Ubuntu или Debian.
|
||||
Например, в Ubuntu Bionic вы можете использовать следующие команды:
|
||||
|
||||
``` bash
|
||||
echo "deb [trusted=yes] http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
||||
sudo apt-get update
|
||||
sudo apt-get install clang-8
|
||||
```
|
||||
|
||||
# Установка Набора Инструментов Перекрестной Компиляции {#install-cross-compilation-toolset}
|
||||
|
||||
``` bash
|
||||
cd ClickHouse
|
||||
mkdir -p build-aarch64/cmake/toolchain/linux-aarch64
|
||||
wget 'https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz?revision=2e88a73f-d233-4f96-b1f4-d8b36e9bb0b9&la=en' -O gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
|
||||
tar xJf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C build-aarch64/cmake/toolchain/linux-aarch64 --strip-components=1
|
||||
```
|
||||
|
||||
# Построить ClickHouse {#build-clickhouse}
|
||||
|
||||
``` bash
|
||||
cd ClickHouse
|
||||
mkdir build-arm64
|
||||
CC=clang-8 CXX=clang++-8 cmake . -Bbuild-arm64 -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake
|
||||
ninja -C build-arm64
|
||||
```
|
||||
|
||||
Полученный двоичный файл будет работать только в Linux с архитектурой процессора AARCH64.
|
1
docs/ru/development/build_cross_arm.md
Symbolic link
1
docs/ru/development/build_cross_arm.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/build_cross_arm.md
|
@ -1,62 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Как построить ClickHouse на Linux для Mac OS X {#how-to-build-clickhouse-on-linux-for-mac-os-x}
|
||||
|
||||
Это для случая, когда у вас есть Linux-машина и вы хотите использовать ее для сборки `clickhouse` двоичный файл, который будет работать на OS X. Это предназначено для непрерывной проверки интеграции, которая выполняется на серверах Linux. Если вы хотите построить ClickHouse непосредственно на Mac OS X, то продолжайте [еще одна инструкция](build_osx.md).
|
||||
|
||||
Кросс-сборка для Mac OS X основана на следующих принципах: [Инструкции по сборке](build.md)- сначала следуйте за ними.
|
||||
|
||||
# Установка Clang-8 {#install-clang-8}
|
||||
|
||||
Следуйте инструкциям от https://apt.llvm.org/ для вашей установки Ubuntu или Debian.
|
||||
Например команды для Bionic выглядят так:
|
||||
|
||||
``` bash
|
||||
sudo echo "deb [trusted=yes] http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main" >> /etc/apt/sources.list
|
||||
sudo apt-get install clang-8
|
||||
```
|
||||
|
||||
# Установка Набора Инструментов Перекрестной Компиляции {#install-cross-compilation-toolset}
|
||||
|
||||
Давайте вспомним путь, по которому мы устанавливаем `cctools` как ${CCTOOLS}
|
||||
|
||||
``` bash
|
||||
mkdir ${CCTOOLS}
|
||||
|
||||
git clone https://github.com/tpoechtrager/apple-libtapi.git
|
||||
cd apple-libtapi
|
||||
INSTALLPREFIX=${CCTOOLS} ./build.sh
|
||||
./install.sh
|
||||
cd ..
|
||||
|
||||
git clone https://github.com/tpoechtrager/cctools-port.git
|
||||
cd cctools-port/cctools
|
||||
./configure --prefix=${CCTOOLS} --with-libtapi=${CCTOOLS} --target=x86_64-apple-darwin
|
||||
make install
|
||||
```
|
||||
|
||||
Кроме того, нам нужно загрузить MacOS X SDK в рабочее дерево.
|
||||
|
||||
``` bash
|
||||
cd ClickHouse
|
||||
wget 'https://github.com/phracker/MacOSX-SDKs/releases/download/10.14-beta4/MacOSX10.14.sdk.tar.xz'
|
||||
mkdir -p build-darwin/cmake/toolchain/darwin-x86_64
|
||||
tar xJf MacOSX10.14.sdk.tar.xz -C build-darwin/cmake/toolchain/darwin-x86_64 --strip-components=1
|
||||
```
|
||||
|
||||
# Построить ClickHouse {#build-clickhouse}
|
||||
|
||||
``` bash
|
||||
cd ClickHouse
|
||||
mkdir build-osx
|
||||
CC=clang-8 CXX=clang++-8 cmake . -Bbuild-osx -DCMAKE_TOOLCHAIN_FILE=cmake/darwin/toolchain-x86_64.cmake \
|
||||
-DCMAKE_AR:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ar \
|
||||
-DCMAKE_RANLIB:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ranlib \
|
||||
-DLINKER_NAME=${CCTOOLS}/bin/x86_64-apple-darwin-ld
|
||||
ninja -C build-osx
|
||||
```
|
||||
|
||||
Полученный двоичный файл будет иметь исполняемый формат Mach-O и не может быть запущен в Linux.
|
1
docs/ru/development/build_cross_osx.md
Symbolic link
1
docs/ru/development/build_cross_osx.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/build_cross_osx.md
|
@ -1,91 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Как построить ClickHouse на Mac OS X {#how-to-build-clickhouse-on-mac-os-x}
|
||||
|
||||
Сборка должна работать на Mac OS X 10.15 (Catalina)
|
||||
|
||||
## Установите Homebrew {#install-homebrew}
|
||||
|
||||
``` bash
|
||||
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||
```
|
||||
|
||||
## Установите необходимые компиляторы, инструменты и библиотеки {#install-required-compilers-tools-and-libraries}
|
||||
|
||||
``` bash
|
||||
$ brew install cmake ninja libtool gettext
|
||||
```
|
||||
|
||||
## Проверка Источников ClickHouse {#checkout-clickhouse-sources}
|
||||
|
||||
``` bash
|
||||
$ git clone --recursive git@github.com:ClickHouse/ClickHouse.git
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
``` bash
|
||||
$ git clone --recursive https://github.com/ClickHouse/ClickHouse.git
|
||||
|
||||
$ cd ClickHouse
|
||||
```
|
||||
|
||||
## Построить ClickHouse {#build-clickhouse}
|
||||
|
||||
``` bash
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake .. -DCMAKE_CXX_COMPILER=`which clang++` -DCMAKE_C_COMPILER=`which clang`
|
||||
$ ninja
|
||||
$ cd ..
|
||||
```
|
||||
|
||||
## Предостережения {#caveats}
|
||||
|
||||
Если вы собираетесь запустить clickhouse-сервер, убедитесь в том, чтобы увеличить параметром maxfiles системная переменная.
|
||||
|
||||
!!! info "Примечание"
|
||||
Вам нужно будет использовать sudo.
|
||||
|
||||
Для этого создайте следующий файл:
|
||||
|
||||
/Библиотека / LaunchDaemons / limit.параметром maxfiles.файл plist:
|
||||
|
||||
``` xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>limit.maxfiles</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>launchctl</string>
|
||||
<string>limit</string>
|
||||
<string>maxfiles</string>
|
||||
<string>524288</string>
|
||||
<string>524288</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>ServiceIPC</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
Выполните следующую команду:
|
||||
|
||||
``` bash
|
||||
$ sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
|
||||
```
|
||||
|
||||
Перезагрузить.
|
||||
|
||||
Чтобы проверить, работает ли он, вы можете использовать `ulimit -n` команда.
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/development/build_osx/) <!--hide-->
|
1
docs/ru/development/build_osx.md
Symbolic link
1
docs/ru/development/build_osx.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/build_osx.md
|
@ -1,8 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Разработка ClickHouse {#clickhouse-development}
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/development/) <!--hide-->
|
1
docs/ru/development/index.md
Symbolic link
1
docs/ru/development/index.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/index.md
|
@ -1,250 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Тестирование ClickHouse {#clickhouse-testing}
|
||||
|
||||
## Функциональные пробы {#functional-tests}
|
||||
|
||||
Функциональные тесты являются наиболее простыми и удобными в использовании. Большинство функций ClickHouse можно протестировать с помощью функциональных тестов, и они обязательны для использования при каждом изменении кода ClickHouse, которое может быть протестировано таким образом.
|
||||
|
||||
Каждый функциональный тест отправляет один или несколько запросов на запущенный сервер ClickHouse и сравнивает результат со ссылкой.
|
||||
|
||||
Тесты расположены в `queries` каталог. Существует два подкаталога: `stateless` и `stateful`. Тесты без состояния выполняют запросы без каких - либо предварительно загруженных тестовых данных-они часто создают небольшие синтетические наборы данных на лету, в самом тесте. Статусные тесты требуют предварительно загруженных тестовых данных от Яндекса.Метрика и не доступна широкой публике. Мы склонны использовать только `stateless` тесты и избегайте добавления новых `stateful` тесты.
|
||||
|
||||
Каждый тест может быть одного из двух типов: `.sql` и `.sh`. `.sql` тест - это простой SQL-скрипт, который передается по конвейеру в `clickhouse-client --multiquery --testmode`. `.sh` тест - это скрипт, который запускается сам по себе.
|
||||
|
||||
Чтобы выполнить все тесты, используйте `testskhouse-test` инструмент. Смотри `--help` для списка возможных вариантов. Вы можете просто запустить все тесты или запустить подмножество тестов, отфильтрованных по подстроке в имени теста: `./clickhouse-test substring`.
|
||||
|
||||
Самый простой способ вызвать функциональные тесты-это скопировать `clickhouse-client` к `/usr/bin/`, бежать `clickhouse-server` а потом бежать `./clickhouse-test` из собственного каталога.
|
||||
|
||||
Чтобы добавить новый тест, создайте `.sql` или `.sh` файл в `queries/0_stateless` каталог, проверьте его вручную, а затем сгенерируйте `.reference` файл создается следующим образом: `clickhouse-client -n --testmode < 00000_test.sql > 00000_test.reference` или `./00000_test.sh > ./00000_test.reference`.
|
||||
|
||||
Тесты должны использовать (создавать, отбрасывать и т. д.) Только таблицы в `test` предполагается, что база данных создается заранее; также тесты могут использовать временные таблицы.
|
||||
|
||||
Если вы хотите использовать распределенные запросы в функциональных тестах, вы можете использовать их в качестве рычагов `remote` функция таблицы с `127.0.0.{1..2}` адреса для запроса самого сервера; или вы можете использовать предопределенные тестовые кластеры в файле конфигурации сервера, например `test_shard_localhost`.
|
||||
|
||||
Некоторые тесты помечены знаком `zookeeper`, `shard` или `long` в своем названии.
|
||||
`zookeeper` это для тестов, которые используют ZooKeeper. `shard` это для тестов, что
|
||||
требуется сервер для прослушивания `127.0.0.*`; `distributed` или `global` есть то же самое
|
||||
значение. `long` это для тестов, которые работают немного дольше, чем одна секунда. Ты можешь
|
||||
отключите эти группы тестов с помощью `--no-zookeeper`, `--no-shard` и
|
||||
`--no-long` варианты, соответственно.
|
||||
|
||||
## Известная ошибка {#known-bugs}
|
||||
|
||||
Если мы знаем некоторые ошибки, которые могут быть легко воспроизведены функциональными тестами, мы помещаем подготовленные функциональные тесты в `queries/bugs` каталог. Эти тесты будут перенесены в `teststests_stateless` когда ошибки будут исправлены.
|
||||
|
||||
## Интеграционные Тесты {#integration-tests}
|
||||
|
||||
Интеграционные тесты позволяют тестировать ClickHouse в кластерной конфигурации и взаимодействие ClickHouse с другими серверами, такими как MySQL, Postgres, MongoDB. Они полезны для эмуляции сетевых разбиений, отбрасывания пакетов и т. д. Эти тесты выполняются в Docker и создают несколько контейнеров с различным программным обеспечением.
|
||||
|
||||
Видеть `testsgration/README.md` о том, как проводить эти тесты.
|
||||
|
||||
Обратите внимание, что интеграция ClickHouse со сторонними драйверами не тестируется. Кроме того, в настоящее время у нас нет интеграционных тестов с нашими драйверами JDBC и ODBC.
|
||||
|
||||
## Модульное тестирование {#unit-tests}
|
||||
|
||||
Модульные тесты полезны, если вы хотите протестировать не весь ClickHouse в целом, а одну изолированную библиотеку или класс. Вы можете включить или отключить сборку тестов с помощью `ENABLE_TESTS` Вариант CMake. Модульные тесты (и другие тестовые программы) расположены в `tests` подкаталоги по всему коду. Чтобы запустить модульные тесты, введите `ninja test`. Некоторые тесты используют `gtest`, но некоторые из них-это просто программы, которые возвращают ненулевой код выхода при сбое теста.
|
||||
|
||||
Не обязательно иметь модульные тесты, Если код уже охвачен функциональными тестами (а функциональные тесты обычно гораздо более просты в использовании).
|
||||
|
||||
## Эксплуатационное испытание {#performance-tests}
|
||||
|
||||
Тесты производительности позволяют измерять и сравнивать производительность некоторой изолированной части ClickHouse по синтетическим запросам. Тесты расположены по адресу `tests/performance`. Каждый тест представлен следующим образом `.xml` файл с описанием тестового случая. Тесты выполняются с помощью `clickhouse performance-test` инструмент (который встроен в `clickhouse` двоичный). Видеть `--help` для призыва.
|
||||
|
||||
Каждый тест запускает один или несколько запросов (возможно, с комбинациями параметров) в цикле с некоторыми условиями остановки (например «maximum execution speed is not changing in three seconds») и измерьте некоторые показатели производительности запросов (например, «maximum execution speed»). Некоторые тесты могут содержать предварительные условия для предварительно загруженного тестового набора данных.
|
||||
|
||||
Если вы хотите улучшить производительность ClickHouse в каком-то сценарии, и если улучшения могут наблюдаться в простых запросах, настоятельно рекомендуется написать тест производительности. Это всегда имеет смысл использовать `perf top` или другие инструменты perf во время ваших тестов.
|
||||
|
||||
## Инструменты И Сценарии Тестирования {#test-tools-and-scripts}
|
||||
|
||||
Некоторые программы в `tests` каталог-это не подготовленные тесты, а инструменты тестирования. Например, для `Lexer` есть такой инструмент `dbms/Parsers/tests/lexer` это просто делает токенизацию stdin и записывает раскрашенный результат в stdout. Вы можете использовать эти инструменты в качестве примеров кода, а также для исследования и ручного тестирования.
|
||||
|
||||
Вы также можете разместить пару файлов `.sh` и `.reference` вместе с инструментом нужно запустить его на каком - то заранее заданном входе- тогда результат скрипта можно сравнить с `.reference` файл. Такого рода тесты не автоматизированы.
|
||||
|
||||
## Различные Тесты {#miscellanous-tests}
|
||||
|
||||
Существуют тесты для внешних словарей, расположенных по адресу `tests/external_dictionaries` и для машинно-обученных моделей в `tests/external_models`. Эти тесты не обновляются и должны быть перенесены в интеграционные тесты.
|
||||
|
||||
Существует отдельный тест для вставки кворума. Этот тест запускает кластер ClickHouse на отдельных серверах и эмулирует различные случаи сбоя: разделение сети, отбрасывание пакетов (между узлами ClickHouse, между ClickHouse и ZooKeeper, между сервером ClickHouse и клиентом и т. д.), `kill -9`, `kill -STOP` и `kill -CONT` , любить [Джепсен](https://aphyr.com/tags/Jepsen). Затем тест проверяет, что все признанные вставки были записаны, а все отклоненные вставки-нет.
|
||||
|
||||
Тест кворума был написан отдельной командой еще до того, как ClickHouse стал открытым исходным кодом. Эта команда больше не работает с ClickHouse. Тест был случайно написан на Java. По этим причинам тест кворума должен быть переписан и перенесен в интеграционные тесты.
|
||||
|
||||
## Ручное тестирование {#manual-testing}
|
||||
|
||||
Когда вы разрабатываете новую функцию, разумно также протестировать ее вручную. Вы можете сделать это с помощью следующих шагов:
|
||||
|
||||
Постройте ClickHouse. Запустите ClickHouse из терминала: измените каталог на `programs/clickhouse-server` и запустить его с помощью `./clickhouse-server`. Он будет использовать конфигурацию (`config.xml`, `users.xml` и файлы внутри `config.d` и `users.d` каталоги) из текущего каталога по умолчанию. Чтобы подключиться к серверу ClickHouse, выполните команду `programs/clickhouse-client/clickhouse-client`.
|
||||
|
||||
Обратите внимание, что все инструменты clickhouse (сервер, клиент и т. д.) являются просто символическими ссылками на один двоичный файл с именем `clickhouse`. Вы можете найти этот двоичный файл по адресу `programs/clickhouse`. Все инструменты также могут быть вызваны как `clickhouse tool` вместо `clickhouse-tool`.
|
||||
|
||||
В качестве альтернативы вы можете установить пакет ClickHouse: либо стабильный релиз из репозитория Яндекса, либо вы можете построить пакет для себя с помощью `./release` в корне источников ClickHouse. Затем запустите сервер с помощью `sudo service clickhouse-server start` (или остановить, чтобы остановить сервер). Ищите журналы по адресу `/etc/clickhouse-server/clickhouse-server.log`.
|
||||
|
||||
Когда ClickHouse уже установлен в вашей системе, вы можете построить новый `clickhouse` двоичный код и заменить существующий двоичный код:
|
||||
|
||||
``` bash
|
||||
$ sudo service clickhouse-server stop
|
||||
$ sudo cp ./clickhouse /usr/bin/
|
||||
$ sudo service clickhouse-server start
|
||||
```
|
||||
|
||||
Также вы можете остановить системный clickhouse-сервер и запустить свой собственный с той же конфигурацией, но с регистрацией в терминал:
|
||||
|
||||
``` bash
|
||||
$ sudo service clickhouse-server stop
|
||||
$ sudo -u clickhouse /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml
|
||||
```
|
||||
|
||||
Пример с gdb:
|
||||
|
||||
``` bash
|
||||
$ sudo -u clickhouse gdb --args /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml
|
||||
```
|
||||
|
||||
Если системный clickhouse-сервер уже запущен, и вы не хотите его останавливать, вы можете изменить номера портов в своей системе. `config.xml` (или переопределить их в файле внутри `config.d` каталог), укажите соответствующий путь к данным и запустите его.
|
||||
|
||||
`clickhouse` binary почти не имеет зависимостей и работает в широком диапазоне дистрибутивов Linux. Чтобы быстро и грязно протестировать свои изменения на сервере, вы можете просто `scp` ваша свежая постройка `clickhouse` двоичный файл на ваш сервер, а затем запустите его, как в приведенных выше примерах.
|
||||
|
||||
## Тестовая среда {#testing-environment}
|
||||
|
||||
Перед публикацией релиза как стабильного мы развертываем его в тестовой среде. Среда тестирования-это кластер, который обрабатывает 1/39 часть [Яндекс.Метрика](https://metrica.yandex.com/) данные. Мы делимся нашей тестовой средой с Яндексом.Команда метрики. ClickHouse обновляется без простоев поверх существующих данных. Мы смотрим сначала на то, что данные обрабатываются успешно, не отставая от реального времени, репликация продолжает работать и нет никаких проблем, видимых Яндексу.Команда метрики. Первую проверку можно провести следующим образом:
|
||||
|
||||
``` sql
|
||||
SELECT hostName() AS h, any(version()), any(uptime()), max(UTCEventTime), count() FROM remote('example01-01-{1..3}t', merge, hits) WHERE EventDate >= today() - 2 GROUP BY h ORDER BY h;
|
||||
```
|
||||
|
||||
В некоторых случаях мы также развернуть на тестирование среды нашего друга команды Яндекса: Маркет, облако и т. д. Кроме того, у нас есть некоторые аппаратные серверы, которые используются для целей разработки.
|
||||
|
||||
## Нагрузочное тестирование {#load-testing}
|
||||
|
||||
После развертывания в среде тестирования мы запускаем нагрузочное тестирование с запросами из производственного кластера. Это делается вручную.
|
||||
|
||||
Убедитесь, что вы включили `query_log` на вашем производственном кластере.
|
||||
|
||||
Сбор журнала запросов в течение одного или нескольких дней:
|
||||
|
||||
``` bash
|
||||
$ clickhouse-client --query="SELECT DISTINCT query FROM system.query_log WHERE event_date = today() AND query LIKE '%ym:%' AND query NOT LIKE '%system.query_log%' AND type = 2 AND is_initial_query" > queries.tsv
|
||||
```
|
||||
|
||||
Это очень сложный пример. `type = 2` будет фильтровать запросы, которые выполняются успешно. `query LIKE '%ym:%'` это выбор релевантных запросов от Яндекса.Метрика. `is_initial_query` это выбор только тех запросов, которые инициируются клиентом, а не самим ClickHouse (как части распределенной обработки запросов).
|
||||
|
||||
`scp` это войдите в свой тестовый кластер и запустите его следующим образом:
|
||||
|
||||
``` bash
|
||||
$ clickhouse benchmark --concurrency 16 < queries.tsv
|
||||
```
|
||||
|
||||
(вероятно, вы также хотите указать a `--user`)
|
||||
|
||||
Затем оставьте его на ночь или выходные и идите отдыхать.
|
||||
|
||||
Вы должны это проверить `clickhouse-server` не дает сбоя, объем памяти ограничен, а производительность не ухудшается с течением времени.
|
||||
|
||||
Точные тайминги выполнения запросов не регистрируются и не сравниваются из-за высокой вариативности запросов и окружающей среды.
|
||||
|
||||
## Построение Тестов {#build-tests}
|
||||
|
||||
Тесты сборки позволяют проверить, что сборка не нарушается на различных альтернативных конфигурациях и на некоторых зарубежных системах. Тесты расположены по адресу `ci` каталог. Они запускают сборку из исходного кода внутри Docker, Vagrant, а иногда и с помощью `qemu-user-static` внутри Докер. Эти тесты находятся в стадии разработки, и тестовые запуски не автоматизированы.
|
||||
|
||||
Мотивация:
|
||||
|
||||
Обычно мы выпускаем и запускаем все тесты на одном варианте сборки ClickHouse. Но есть и альтернативные варианты сборки, которые не проходят тщательной проверки. Примеры:
|
||||
|
||||
- сборка на FreeBSD;
|
||||
- сборка на Debian с библиотеками из системных пакетов;
|
||||
- сборка с общим связыванием библиотек;
|
||||
- построить на платформе AArch64 ;
|
||||
- постройте на платформе PowerPc.
|
||||
|
||||
Например, сборка с системными пакетами-это плохая практика, потому что мы не можем гарантировать, какая именно версия пакетов будет у системы. Но это действительно необходимо сопровождающим Debian. По этой причине мы, по крайней мере, должны поддерживать этот вариант сборки. Другой пример: Общие ссылки-это общий источник проблем, но он необходим для некоторых энтузиастов.
|
||||
|
||||
Хотя мы не можем выполнить все тесты на всех вариантах сборки, мы хотим проверить, по крайней мере, что различные варианты сборки не нарушены. Для этого мы используем тесты сборки.
|
||||
|
||||
## Тестирование Совместимости Протоколов {#testing-for-protocol-compatibility}
|
||||
|
||||
Когда мы расширяем сетевой протокол ClickHouse, мы вручную проверяем, что старый clickhouse-клиент работает с новым clickhouse-сервером, а новый clickhouse-клиент работает со старым clickhouse-сервером (просто запустив двоичные файлы из соответствующих пакетов).
|
||||
|
||||
## Помощь От Компилятора {#help-from-the-compiler}
|
||||
|
||||
Основной код ClickHouse (который находится в `dbms` каталог) строится с помощью `-Wall -Wextra -Werror` и с некоторыми дополнительными включенными предупреждениями. Хотя эти параметры не включены для сторонних библиотек.
|
||||
|
||||
У Clang есть еще более полезные предупреждения - вы можете искать их с помощью `-Weverything` и выберите что-то для сборки по умолчанию.
|
||||
|
||||
Для производственных сборок используется gcc (он все еще генерирует немного более эффективный код, чем clang). Для развития, лязгают, как правило, более удобны в использовании. Вы можете построить на своей собственной машине с режимом отладки (чтобы сэкономить батарею вашего ноутбука), но обратите внимание, что компилятор способен генерировать больше предупреждений с помощью `-O3` благодаря лучшему потоку управления и межпроцедурному анализу. При строительстве с лязгом, `libc++` используется вместо `libstdc++` и при построении с режимом отладки, отладочная версия `libc++` используется, что позволяет ловить больше ошибок во время выполнения.
|
||||
|
||||
## Дезинфицирующее средство {#sanitizers}
|
||||
|
||||
**Адрес дезинфицирующее средство**.
|
||||
Мы проводим функциональные и интеграционные тесты в асане на фиксации основы.
|
||||
|
||||
**С Valgrind (Помощи Valgrind)**.
|
||||
Мы проводим функциональные тесты под Valgrind ночь. Это займет несколько часов. В настоящее время существует один известный ложноположительный результат в `re2` библиотека, см. [эта статья](https://research.swtch.com/sparse).
|
||||
|
||||
**Неопределенное поведение дезинфицирующего средства.**
|
||||
Мы проводим функциональные и интеграционные тесты в асане на фиксации основы.
|
||||
|
||||
**Дезинфицирующее средство для нитей**.
|
||||
Мы проводим функциональные тесты в рамках TSan на основе per-commit. Мы все еще не запускаем интеграционные тесты под TSan на основе per-commit.
|
||||
|
||||
**Дезинфицирующее средство для памяти**.
|
||||
В настоящее время мы все еще не используем MSan.
|
||||
|
||||
**Отладочный распределитель.**
|
||||
Отладочная версия `jemalloc` используется для отладки сборки.
|
||||
|
||||
## Затуманивающего {#fuzzing}
|
||||
|
||||
Мы используем простой тест fuzz для генерации случайных SQL-запросов и проверки того, что сервер не умирает. Тестирование пуха проводится с помощью адресного дезинфицирующего средства. Вы можете найти его в `00746_sql_fuzzy.pl`. Этот тест следует проводить непрерывно (в течение ночи и дольше).
|
||||
|
||||
По состоянию на декабрь 2018 года мы все еще не используем изолированное тестирование fuzz библиотечного кода.
|
||||
|
||||
## Аудит безопасности {#security-audit}
|
||||
|
||||
Люди из облачного отдела Яндекса делают некоторый базовый обзор возможностей ClickHouse с точки зрения безопасности.
|
||||
|
||||
## Статический анализатор {#static-analyzers}
|
||||
|
||||
Мы бежим `PVS-Studio` на основе каждой фиксации. Мы провели оценку `clang-tidy`, `Coverity`, `cppcheck`, `PVS-Studio`, `tscancode`. Вы найдете инструкции по использованию в `tests/instructions/` каталог. Кроме того, вы можете читать [статья на русском языке](https://habr.com/company/yandex/blog/342018/).
|
||||
|
||||
Если вы используете `CLion` как IDE, вы можете использовать некоторые из них `clang-tidy` выписывает чеки из коробки.
|
||||
|
||||
## Затвердение {#hardening}
|
||||
|
||||
`FORTIFY_SOURCE` используется по умолчанию. Это почти бесполезно, но все же имеет смысл в редких случаях, и мы не отключаем его.
|
||||
|
||||
## Стиль Кода {#code-style}
|
||||
|
||||
Описаны правила стиля кода [здесь](https://clickhouse.tech/docs/en/development/style/).
|
||||
|
||||
Чтобы проверить наличие некоторых распространенных нарушений стиля, вы можете использовать `utils/check-style` скрипт.
|
||||
|
||||
Чтобы принудительно создать правильный стиль вашего кода, Вы можете использовать `clang-format`. Файл `.clang-format` находится в корне источника. Это в основном соответствует нашему фактическому стилю кода. Но применять его не рекомендуется `clang-format` к существующим файлам, потому что это ухудшает форматирование. Вы можете использовать `clang-format-diff` инструмент, который вы можете найти в репозитории Clang source.
|
||||
|
||||
В качестве альтернативы вы можете попробовать `uncrustify` инструмент для переформатирования вашего кода. Конфигурации в `uncrustify.cfg` в корне источников. Это меньше, чем `clang-format`.
|
||||
|
||||
`CLion` имеет свой собственный формататор кода, который должен быть настроен для нашего стиля кода.
|
||||
|
||||
## В2В метрика тесты {#metrica-b2b-tests}
|
||||
|
||||
Каждый релиз ClickHouse тестируется с помощью движков Yandex Metrica и AppMetrica. Тестовые и стабильные версии ClickHouse развертываются на виртуальных машинах и запускаются с небольшой копией движка Metrica engine, который обрабатывает фиксированную выборку входных данных. Затем результаты двух экземпляров двигателя Metrica сравниваются вместе.
|
||||
|
||||
Эти тесты автоматизированы отдельной командой. Из-за большого количества движущихся частей тесты чаще всего проваливаются по совершенно несвязанным причинам, которые очень трудно выяснить. Скорее всего, эти тесты имеют для нас отрицательное значение. Тем не менее эти тесты оказались полезными примерно в одном или двух случаях из сотен.
|
||||
|
||||
## Тестовое покрытие {#test-coverage}
|
||||
|
||||
По состоянию на июль 2018 года мы не отслеживаем покрытие тестов.
|
||||
|
||||
## Автоматизация тестирования {#test-automation}
|
||||
|
||||
Мы проводим тесты с помощью внутренней CI Яндекса и системы автоматизации заданий под названием «Sandbox».
|
||||
|
||||
Задания сборки и тесты выполняются в песочнице на основе каждой фиксации. Полученные пакеты и результаты тестирования публикуются на GitHub и могут быть загружены по прямым ссылкам. Артефакты хранятся вечно. Когда вы отправляете запрос на вытягивание на GitHub, мы помечаем его как «can be tested» и наша система CI построит пакеты ClickHouse (release, debug, with address sanitizer и т. д.) Для вас.
|
||||
|
||||
Мы не используем Travis CI из-за ограничения по времени и вычислительной мощности.
|
||||
Мы не используем Дженкинса. Он был использован раньше, и теперь мы счастливы, что не используем Дженкинса.
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/development/tests/) <!--hide-->
|
||||
разработка / испытания/) <!--hide-->
|
1
docs/ru/development/tests.md
Symbolic link
1
docs/ru/development/tests.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/development/tests.md
|
@ -1,59 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# GenerateRandom {#table_engines-generate}
|
||||
|
||||
Механизм генерации случайных таблиц генерирует случайные данные для данной схемы таблиц.
|
||||
|
||||
Примеры употребления:
|
||||
|
||||
- Используйте в тесте для заполнения воспроизводимого большого стола.
|
||||
- Генерируйте случайные входные данные для тестов размытия.
|
||||
|
||||
## Использование в сервере ClickHouse {#usage-in-clickhouse-server}
|
||||
|
||||
``` sql
|
||||
ENGINE = GenerateRandom(random_seed, max_string_length, max_array_length)
|
||||
```
|
||||
|
||||
То `max_array_length` и `max_string_length` параметры укажите максимальную длину всех
|
||||
столбцы массива и строки соответственно в генерируемых данных.
|
||||
|
||||
Генерация таблицы движок поддерживает только `SELECT` запросы.
|
||||
|
||||
Он поддерживает все [Тип данных](../../../engines/table_engines/special/generate.md) это может быть сохранено в таблице за исключением `LowCardinality` и `AggregateFunction`.
|
||||
|
||||
**Пример:**
|
||||
|
||||
**1.** Настройка системы `generate_engine_table` стол:
|
||||
|
||||
``` sql
|
||||
CREATE TABLE generate_engine_table (name String, value UInt32) ENGINE = GenerateRandom(1, 5, 3)
|
||||
```
|
||||
|
||||
**2.** Запрос данных:
|
||||
|
||||
``` sql
|
||||
SELECT * FROM generate_engine_table LIMIT 3
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─name─┬──────value─┐
|
||||
│ c4xJ │ 1412771199 │
|
||||
│ r │ 1791099446 │
|
||||
│ 7#$ │ 124312908 │
|
||||
└──────┴────────────┘
|
||||
```
|
||||
|
||||
## Детали внедрения {#details-of-implementation}
|
||||
|
||||
- Не поддерживаемый:
|
||||
- `ALTER`
|
||||
- `SELECT ... SAMPLE`
|
||||
- `INSERT`
|
||||
- Индексы
|
||||
- Копирование
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/operations/table_engines/generate/) <!--hide-->
|
1
docs/ru/engines/table_engines/special/generate.md
Symbolic link
1
docs/ru/engines/table_engines/special/generate.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../en/engines/table_engines/special/generate.md
|
@ -39,18 +39,20 @@ Upd. Большая часть задачи реализована и добав
|
||||
|
||||
Требует 1.3. Будет делать [Александр Сапин](https://github.com/alesapin). Ура, сделано.
|
||||
|
||||
### 1.5. ALTER RENAME COLUMN. {#alter-rename-column}
|
||||
### 1.5. + ALTER RENAME COLUMN. {#alter-rename-column}
|
||||
|
||||
[\#6861](https://github.com/ClickHouse/ClickHouse/issues/6861)
|
||||
|
||||
Требует 1.3. Будет делать [Александр Сапин](https://github.com/alesapin).
|
||||
|
||||
### 1.6. Полиморфные куски данных. {#polimorfnye-kuski-dannykh}
|
||||
### 1.6. + Полиморфные куски данных. {#polimorfnye-kuski-dannykh}
|
||||
|
||||
Компактные куски - Q1, куски в оперативке Q1/Q2.
|
||||
Компактные куски - Q1, куски в оперативке Q1/Q2 - пункт 1.7.
|
||||
|
||||
Компактные куски реализованы, ещё не включены по-умолчанию. Первым шагом включаем по-умолчанию для системных таблиц.
|
||||
|
||||
Upd. Включено для системных таблиц.
|
||||
|
||||
Делает [Антон Попов](https://github.com/CurtizJ), первый рабочий вариант в декабре. Пререквизит чтобы снизить сложность мелких INSERT, что в свою очередь нужно для 1.12, иначе задача 1.12 не сможет нормально работать. Особенно нужно для Яндекс.Облака.
|
||||
|
||||
Данные в таблицах типа MergeTree в ClickHouse хранятся в виде набора независимых «кусков». Внутри куска, каждый столбец, а также индекс, хранится в отдельных файлах. Это сделано для возможности быстрых манипуляций со столбцами (пример - запрос ALTER DROP COLUMN). При вставке данных (INSERT), создаётся новый кусок. Для таблиц с большим количеством столбцов, запросы INSERT с маленьким количеством строк являются неэффективными, так как требуют создания большого количества файлов в файловой системе. Это является врождённой особенностью ClickHouse - одной из первой проблем, с которыми сталкиваются пользователи. Пользователям приходится буферизовывать данные и собирать их в более крупные пачки перед вставкой в ClickHouse.
|
||||
@ -61,7 +63,7 @@ Upd. Большая часть задачи реализована и добав
|
||||
|
||||
### 1.7. Буферизация и WAL в MergeTree. {#buferizatsiia-i-wal-v-mergetree}
|
||||
|
||||
Требует 1.6.
|
||||
Требует 1.6. Антон Попов. Задача взята в работу. Q2.
|
||||
|
||||
### 1.8. + Перенос между разделами по TTL. {#perenos-mezhdu-razdelami-po-ttl}
|
||||
|
||||
@ -74,7 +76,7 @@ Q1. Закоммичено, но есть технический долг, ко
|
||||
|
||||
Будет делать Сорокин Николай, ВШЭ и Яндекс.
|
||||
|
||||
Сейчас пользователь может задать в таблице выражение, которое определяет, сколько времени хранятся данные. Обычно это выражение задаётся относительно значения столбца с датой - например: удалять данные через три месяца. https://clickhouse.tech/docs/ru/operations/table\_engines/mergetree/\#table\_engine-mergetree-ttl
|
||||
Сейчас пользователь может задать в таблице выражение, которое определяет, сколько времени хранятся данные. Обычно это выражение задаётся относительно значения столбца с датой - например: удалять данные через три месяца. https://clickhouse.tech/docs/ru/operations/table_engines/mergetree/\#table_engine-mergetree-ttl
|
||||
|
||||
Это может быть задано для всей таблицы (тогда строки целиком удаляются после указанного времени) или для отдельных столбцов (тогда данные столбца физически удаляются с диска, а строки в таблице остаются; при чтении значений столбца, они читаются как значения по-умолчанию).
|
||||
|
||||
@ -88,7 +90,7 @@ Q1. Закоммичено, но есть технический долг, ко
|
||||
|
||||
А вот пункт 2 требуется продумать. Не очевидно даже, какой лучше использовать синтаксис для этого при создании таблицы. Но мы придумаем - сразу видно несколько вариантов.
|
||||
|
||||
Частный случай такой задачи уже есть в https://clickhouse.tech/docs/ru/operations/table\_engines/graphitemergetree/ Но это было сделано для конкретной задачи. А надо обобщить.
|
||||
Частный случай такой задачи уже есть в https://clickhouse.tech/docs/ru/operations/table_engines/graphitemergetree/ Но это было сделано для конкретной задачи. А надо обобщить.
|
||||
|
||||
### 1.10. Пережатие старых данных в фоне. {#perezhatie-starykh-dannykh-v-fone}
|
||||
|
||||
@ -100,17 +102,15 @@ Q1. Закоммичено, но есть технический долг, ко
|
||||
|
||||
Предлагается добавить в ClickHouse настройки по пережатию данных и фоновые потоки, выполняющие эту задачу.
|
||||
|
||||
### 1.11. Виртуальная файловая система. {#virtualnaia-failovaia-sistema}
|
||||
### 1.11. + Виртуальная файловая система. {#virtualnaia-failovaia-sistema}
|
||||
|
||||
В процессе реализации, сейчас на VFS переведены Log, TinyLog, StripeLog, готовится MergeTree.
|
||||
На VFS переведены Log, TinyLog, StripeLog, а также MergeTree, что доказывает состоятельность реализации.
|
||||
|
||||
Q2.
|
||||
|
||||
Нужно для Яндекс.Облака. Делает Александр, Яндекс.Облако, а также Олег Ершов, ВШЭ и Яндекс.
|
||||
Нужно для Яндекс.Облака. Делает Александр, Яндекс.Облако.
|
||||
|
||||
ClickHouse использует для хранения данных локальную файловую систему. Существует сценарий работы, в котором размещение старых (архивных) данных было бы выгодно на удалённой файловой системе. Если файловая система POSIX совместимая, то это не составляет проблем: ClickHouse успешно работает с Ceph, GlusterFS, MooseFS. Также востребованным является сценарий использования S3 (из-за доступности в облаке) или HDFS (для интеграции с Hadoop). Но эти файловые системы не являются POSIX совместимыми. Хотя для них существуют FUSE драйверы, но скорость работы сильно страдает и поддержка неполная.
|
||||
|
||||
ClickHouse использует небольшое подмножество функций ФС, но в то же время, и некоторые специфические части: симлинки и хардлинки, O\_DIRECT. Предлагается выделить всё взаимодействие с файловой системой в отдельный интерфейс.
|
||||
ClickHouse использует небольшое подмножество функций ФС, но в то же время, и некоторые специфические части: симлинки и хардлинки, O_DIRECT. Предлагается выделить всё взаимодействие с файловой системой в отдельный интерфейс.
|
||||
|
||||
### 1.12. Экспериментальная реализация VFS поверх S3 и HDFS. {#eksperimentalnaia-realizatsiia-vfs-poverkh-s3-i-hdfs}
|
||||
|
||||
@ -121,13 +121,15 @@ Q2.
|
||||
|
||||
Upd. Олег будет делать только часть про HDFS.
|
||||
|
||||
Upd. Реализация поверх S3 является рабочей на уровне PoC.
|
||||
|
||||
### 1.13. Ускорение запросов с FINAL. {#uskorenie-zaprosov-s-final}
|
||||
|
||||
Требует 2.1. Делает [Николай Кочетов](https://github.com/KochetovNicolai). Нужно для Яндекс.Метрики.
|
||||
Требует 2.1. Делает [Николай Кочетов](https://github.com/KochetovNicolai). Нужно для Яндекс.Метрики. Q2.
|
||||
|
||||
### 1.14. Не писать столбцы, полностью состоящие из нулей. {#ne-pisat-stolbtsy-polnostiu-sostoiashchie-iz-nulei}
|
||||
|
||||
Антон Попов. Q1/Q2.
|
||||
Антон Попов. Q2.
|
||||
В очереди. Простая задача, является небольшим пререквизитом для потенциальной поддержки полуструктурированных данных.
|
||||
|
||||
### 1.15. Возможность иметь разный первичный ключ в разных кусках. {#vozmozhnost-imet-raznyi-pervichnyi-kliuch-v-raznykh-kuskakh}
|
||||
@ -146,6 +148,7 @@ Upd. Олег будет делать только часть про HDFS.
|
||||
|
||||
Требует 1.3 и 1.6. Полная замена hard links на sym links, что будет лучше для 1.12.
|
||||
|
||||
|
||||
## 2. Крупные рефакторинги. {#krupnye-refaktoringi}
|
||||
|
||||
Для обоснования необходимости смотрите ссылки в описании других задач.
|
||||
@ -161,6 +164,8 @@ Upd. Включили по-умолчанию. Удаление старого
|
||||
|
||||
Upd. Уже есть первый релиз, в котором это включено по-умолчанию.
|
||||
|
||||
Upd. Всё ещё ждём удаление старого кода, которое должно случиться после релиза 20.4.
|
||||
|
||||
### 2.2. Инфраструктура событий/метрик/ограничений/квот/трассировки. {#infrastruktura-sobytiimetrikogranicheniikvottrassirovki}
|
||||
|
||||
В очереди. https://gist.github.com/alexey-milovidov/d62d73222d83b9319dc519cbb13aeff6
|
||||
@ -193,6 +198,8 @@ Upd. Каталог БД вынесен из Context.
|
||||
|
||||
Средний приоритет. Нужно для YQL.
|
||||
|
||||
Upd. В очереди. Иван Лежанкин.
|
||||
|
||||
### 2.9. Логгировние в format-стиле. {#loggirovnie-v-format-stile}
|
||||
|
||||
Делает [Иван Лежанкин](https://github.com/abyss7). Низкий приоритет.
|
||||
@ -212,10 +219,14 @@ Upd. Каталог БД вынесен из Context.
|
||||
|
||||
Задачу делает Алексей Миловидов. Прогресс 50% и разработка временно приостановлена.
|
||||
|
||||
Upd. Разработка всё ещё приостановлена.
|
||||
|
||||
### 2.13. Каждая функция в отдельном файле. {#kazhdaia-funktsiia-v-otdelnom-faile}
|
||||
|
||||
Задачу делает Алексей Миловидов. Прогресс 80%. Потребуется помощь других разработчиков.
|
||||
|
||||
Upd. Поползновения наблюдаются.
|
||||
|
||||
### 2.14. Все функции с состоянием переделать на FunctionBuilder. {#vse-funktsii-s-sostoianiem-peredelat-na-functionbuilder}
|
||||
|
||||
Долг [Николай Кочетов](https://github.com/KochetovNicolai). Сейчас код находится в переходном состоянии, что неприемлемо.
|
||||
@ -224,13 +235,14 @@ Upd. Каталог БД вынесен из Context.
|
||||
|
||||
Для нормализации работы materialized views поверх Merge, Distributed, Kafka.
|
||||
|
||||
|
||||
## 3. Документация. {#dokumentatsiia}
|
||||
|
||||
Здесь задачи только по инфраструктуре документации.
|
||||
|
||||
### 3.1. Перенос документации по функциям в код. {#perenos-dokumentatsii-po-funktsiiam-v-kod}
|
||||
|
||||
Требует 2.12 и 2.13. Хотим в Q1/Q2, средний приоритет.
|
||||
Требует 2.12 и 2.13. Хотим в Q2, средний приоритет.
|
||||
|
||||
### 3.2. Перенос однородных частей документации в код. {#perenos-odnorodnykh-chastei-dokumentatsii-v-kod}
|
||||
|
||||
@ -246,11 +258,12 @@ Upd. Иван Блинков сделал эту задачу путём зам
|
||||
|
||||
Эту задачу сделает [Иван Блинков](https://github.com/blinkov/), до конца декабря 2019. Сделано.
|
||||
|
||||
|
||||
## 4. Сетевое взаимодействие. {#setevoe-vzaimodeistvie}
|
||||
|
||||
### 4.1. Уменьшение числа потоков при распределённых запросах. {#umenshenie-chisla-potokov-pri-raspredelionnykh-zaprosakh}
|
||||
|
||||
[Никита Лапков](https://github.com/laplab), весна 2020. Upd. Есть прототип. Upd. Он не работает.
|
||||
Весна 2020. Upd. Есть прототип. Upd. Он не работает. Upd. Человек отказался от задачи, теперь сроки не определены.
|
||||
|
||||
### 4.2. Спекулятивное выполнение запросов на нескольких репликах. {#spekuliativnoe-vypolnenie-zaprosov-na-neskolkikh-replikakh}
|
||||
|
||||
@ -262,6 +275,8 @@ Upd. Иван Блинков сделал эту задачу путём зам
|
||||
|
||||
Сейчас для распределённых запросов используется по потоку на соединение. Это позволяет хорошо распараллелить вычисления над полученными данными и утилизировать сеть, но становится сильно избыточным для больших кластеров. Для примера, создание 1000 потоков для чтения данных из 1000 серверов кластера - лишь расходует ресурсы и увеличивает время выполнения запроса. Вместо этого необходимо использовать количество потоков не большее количества процессорных ядер, и мультиплексировать в одном потоке общение с серверами. Реализация нетривиальна, так как мультиплексировать необходимо каждую стадию общения по сети, включая установку соединения и обмен handshake.
|
||||
|
||||
Upd. Сейчас обсуждается, как сделать другую задачу вместо этой.
|
||||
|
||||
### 4.3. Ограничение числа одновременных скачиваний с реплик. {#ogranichenie-chisla-odnovremennykh-skachivanii-s-replik}
|
||||
|
||||
Дмитрий Григорьев, ВШЭ.
|
||||
@ -284,14 +299,16 @@ Upd. Иван Блинков сделал эту задачу путём зам
|
||||
Дмитрий Григорьев, ВШЭ.
|
||||
В очереди. Исправить проблему, что восстанавливающаяся реплика перестаёт мержить. Частично компенсируется 4.3.
|
||||
|
||||
|
||||
## 5. Операции. {#operatsii}
|
||||
|
||||
### 5.1. Разделение задач на более мелкие куски в clickhouse-copier. {#razdelenie-zadach-na-bolee-melkie-kuski-v-clickhouse-copier}
|
||||
### 5.1. + Разделение задач на более мелкие куски в clickhouse-copier. {#razdelenie-zadach-na-bolee-melkie-kuski-v-clickhouse-copier}
|
||||
|
||||
[\#9075](https://github.com/ClickHouse/ClickHouse/pull/9075)
|
||||
Q1. Нужно для Метрики, в очереди. Никита Михайлов.
|
||||
|
||||
Upd. Задача на финальной стадии разработки.
|
||||
Upd. Сделано. Эффективность работы под вопросом. Есть варианты, как сделать лучше.
|
||||
|
||||
### 5.2. Автонастройка лимита на оперативку и размера кэшей. {#avtonastroika-limita-na-operativku-i-razmera-keshei}
|
||||
|
||||
@ -305,6 +322,8 @@ Upd. Задача на финальной стадии разработки.
|
||||
|
||||
Требует 7.5. Задачу хочет Метрика, Облако, БК, Маркет и Altinity. Первой LTS версией уже стала версия 19.14.
|
||||
Метрика, БК, Маркет, Altinity уже используют более свежие версии чем LTS.
|
||||
Upd. Появилась вторая версия LTS - 20.3.
|
||||
|
||||
|
||||
## 6. Инструментирование. {#instrumentirovanie}
|
||||
|
||||
@ -321,7 +340,7 @@ Upd. Задача на финальной стадии разработки.
|
||||
|
||||
### 6.3. Учёт оперативки total расширить не только на запросы. {#uchiot-operativki-total-rasshirit-ne-tolko-na-zaprosy}
|
||||
|
||||
Исправление долгоживущей проблемы с дрифтом учёта оперативки. Нужна для Метрики и БК. Иван Лежанкин. Q1.
|
||||
Исправление долгоживущей проблемы с дрифтом учёта оперативки. Нужна для Метрики и БК. Иван Лежанкин. Q1. Странно, как будто не сделано.
|
||||
|
||||
### 6.4. Поддержка perf events как метрик запроса. {#podderzhka-perf-events-kak-metrik-zaprosa}
|
||||
|
||||
@ -339,7 +358,7 @@ Upd. Задача на финальной стадии разработки.
|
||||
|
||||
Сейчас есть стек трейс для почти всех, но не всех исключений. Требует 7.4.
|
||||
|
||||
### 6.7. + Таблица system.stack\_trace. {#tablitsa-system-stack-trace}
|
||||
### 6.7. + Таблица system.stack_trace. {#tablitsa-system-stack-trace}
|
||||
|
||||
Сравнительно простая задача, но только для опытных разработчиков.
|
||||
|
||||
@ -351,6 +370,7 @@ Upd. Задача на финальной стадии разработки.
|
||||
|
||||
### 6.10. Сбор общих системных метрик. {#sbor-obshchikh-sistemnykh-metrik}
|
||||
|
||||
|
||||
## 7. Сопровождение разработки. {#soprovozhdenie-razrabotki}
|
||||
|
||||
### 7.1. + ICU в submodules. {#icu-v-submodules}
|
||||
@ -361,7 +381,7 @@ Upd. Задача на финальной стадии разработки.
|
||||
|
||||
Сделал Алексей Миловидов.
|
||||
|
||||
### 7.3. Обновление Poco. {#obnovlenie-poco}
|
||||
### 7.3. + Обновление Poco. {#obnovlenie-poco}
|
||||
|
||||
Алексанр Кузьменков.
|
||||
|
||||
@ -383,13 +403,18 @@ Upd. Задача на финальной стадии разработки.
|
||||
Уже есть ASan, TSan, UBSan. Не хватает тестов под MSan. Они уже добавлены в CI, но не проходят.
|
||||
[Александр Кузьменков](https://github.com/akuzm) и [Александр Токмаков](https://github.com/tavplubix).
|
||||
|
||||
### 7.8. Добавить clang-tidy. {#dobavit-clang-tidy}
|
||||
Upd. Задача всё ещё медленно тащится.
|
||||
|
||||
### 7.8. + Добавить clang-tidy. {#dobavit-clang-tidy}
|
||||
|
||||
Уже есть PVS-Studio. Мы очень довольны, но этого недостаточно.
|
||||
|
||||
Upd. Алексей Миловидов. Добавлено некоторое множество проверок, но нужно рассмотреть все проверки подряд и добавить всё, что можно.
|
||||
Upd. Рассмотрели все проверки подряд.
|
||||
|
||||
### 7.9. Проверки на стиль имён с помощью clang-tidy. {#proverki-na-stil-imion-s-pomoshchiu-clang-tidy}
|
||||
### 7.9. + Проверки на стиль имён с помощью clang-tidy. {#proverki-na-stil-imion-s-pomoshchiu-clang-tidy}
|
||||
|
||||
Сделано. Только в .cpp файлах и только для имён локальных переменных. Остальное слишком сложно.
|
||||
|
||||
### 7.10. Включение UBSan и MSan в интеграционных тестах. {#vkliuchenie-ubsan-i-msan-v-integratsionnykh-testakh}
|
||||
|
||||
@ -399,6 +424,8 @@ UBSan включен в функциональных тестах, но не в
|
||||
|
||||
У нас мало unit тестов по сравнению с функциональными тестами и их использование не обязательно. Но они всё-равно важны и нет причин не запускать их под всеми видами sanitizers.
|
||||
|
||||
Илья Яцишин.
|
||||
|
||||
### 7.12. Показывать тестовое покрытие нового кода в PR. {#pokazyvat-testovoe-pokrytie-novogo-koda-v-pr}
|
||||
|
||||
Пока есть просто показ тестового покрытия всего кода.
|
||||
@ -413,6 +440,8 @@ UBSan включен в функциональных тестах, но не в
|
||||
|
||||
Подключение replxx вместо readline сделал Иван Лежанкин.
|
||||
|
||||
Есть технический долг с лицензиями файлов консорциума Unicode.
|
||||
|
||||
### 7.14.1. Улучшение возможностей интерактивного режима clickhouse-client. {#uluchshenie-vozmozhnostei-interaktivnogo-rezhima-clickhouse-client}
|
||||
|
||||
Тагир Кускаров, ВШЭ.
|
||||
@ -476,7 +505,7 @@ https://github.com/ClickHouse/ClickHouse/issues/8027\#issuecomment-566670282
|
||||
Проверили на настоящем сервере Huawei, а также в специальном Docker контейнере, который содержит внутри qemu-user-static.
|
||||
Также можно проверить на Cavium, на Raspberry Pi а также на твоём Android телефоне.
|
||||
|
||||
### 7.20. Автосборка для FreeBSD x86\_64. {#avtosborka-dlia-freebsd-x86-64}
|
||||
### 7.20. Автосборка для FreeBSD x86_64. {#avtosborka-dlia-freebsd-x86-64}
|
||||
|
||||
[Иван Лежанкин](https://github.com/abyss7).
|
||||
|
||||
@ -535,6 +564,8 @@ Fuzzing тестирование - это тестирование случай
|
||||
Также можно сделать функции с детерминированным генератором случайных чисел (аргументом передаётся seed) для воспроизводимости тестовых кейсов.
|
||||
|
||||
Upd. Сергей Штыков сделал функцию `randomPrintableASCII`.
|
||||
Upd. Илья Яцишин сделал табличную функцию `generateRandom`.
|
||||
Upd. Эльдар Заитов добавляет OSS Fuzz.
|
||||
|
||||
### 7.24. Fuzzing лексера и парсера запросов; кодеков и форматов. {#fuzzing-leksera-i-parsera-zaprosov-kodekov-i-formatov}
|
||||
|
||||
@ -557,10 +588,12 @@ Upd. Сергей Штыков сделал функцию `randomPrintableASCII
|
||||
|
||||
Нужно для CHYT и YQL.
|
||||
|
||||
UPD: Все патчи Максима отправлены в master. Задача взята в работу.
|
||||
Upd: Все патчи Максима отправлены в master. Задача взята в работу.
|
||||
|
||||
Upd: Задача в процессе реализации. Синхронизироваться будет master. Делает [Иван Лежанкин](https://github.com/abyss7)
|
||||
|
||||
Upd: Есть собирающийся прототип, но сборка как будто ещё не в trunk Аркадии.
|
||||
|
||||
### 7.26. Побайтовая идентичность репозитория с Аркадией. {#pobaitovaia-identichnost-repozitoriia-s-arkadiei}
|
||||
|
||||
Команда DevTools. Прогресс по задаче под вопросом.
|
||||
@ -617,6 +650,7 @@ Upd: Задача в процессе реализации. Синхронизи
|
||||
Upd. Иван Блинков настроил CDN repo.clickhouse.tech, что решает проблему с доступностью зарубежом.
|
||||
Вопрос с operations, visibility пока актуален.
|
||||
|
||||
|
||||
## 8. Интеграция с внешними системами. {#integratsiia-s-vneshnimi-sistemami}
|
||||
|
||||
### 8.1. Поддержка ALTER MODIFY SETTING для Kafka. {#podderzhka-alter-modify-setting-dlia-kafka}
|
||||
@ -629,11 +663,11 @@ Altinity. Никто не делает эту задачу.
|
||||
|
||||
[Александр Кузьменков](https://github.com/akuzm).
|
||||
|
||||
### 8.3. Доработки globs (правильная поддержка диапазонов, уменьшение числа одновременных stream-ов). {#dorabotki-globs-pravilnaia-podderzhka-diapazonov-umenshenie-chisla-odnovremennykh-stream-ov}
|
||||
### 8.3. + Доработки globs (правильная поддержка диапазонов, уменьшение числа одновременных stream-ов). {#dorabotki-globs-pravilnaia-podderzhka-diapazonov-umenshenie-chisla-odnovremennykh-stream-ov}
|
||||
|
||||
[Ольга Хвостикова](https://github.com/stavrolia).
|
||||
|
||||
Уменьшение числа stream-ов сделано, а вот правильная поддержка диапазонов - нет. Будем надеяться на Q1/Q2.
|
||||
Уменьшение числа stream-ов сделано, а вот правильная поддержка диапазонов - нет. Будем надеяться на Q1/Q2. Сделано.
|
||||
|
||||
### 8.4. Унификация File, HDFS, S3 под URL. {#unifikatsiia-file-hdfs-s3-pod-url}
|
||||
|
||||
@ -690,19 +724,21 @@ Andrew Onyshchuk. Есть pull request. Q1. Сделано.
|
||||
|
||||
Павел Круглов, ВШЭ и Яндекс. Есть pull request.
|
||||
|
||||
### 8.16.2. Поддержка формата Thrift. {#podderzhka-formata-thrift}
|
||||
### 8.16.2. - Поддержка формата Thrift. {#podderzhka-formata-thrift}
|
||||
|
||||
Павел Круглов, ВШЭ и Яндекс.
|
||||
Павел Круглов, ВШЭ и Яндекс. Задача отменена.
|
||||
|
||||
### 8.16.3. Поддержка формата MsgPack. {#podderzhka-formata-msgpack}
|
||||
|
||||
Павел Круглов, ВШЭ и Яндекс.
|
||||
Задача взята в работу.
|
||||
|
||||
### 8.16.4. Формат Regexp. {#format-regexp}
|
||||
Upd. Почти готово - есть лишь небольшой технический долг.
|
||||
|
||||
### 8.16.4. + Формат Regexp. {#format-regexp}
|
||||
|
||||
Павел Круглов, ВШЭ и Яндекс.
|
||||
Есть pull request.
|
||||
Есть pull request. Готово.
|
||||
|
||||
### 8.17. ClickHouse как MySQL реплика. {#clickhouse-kak-mysql-replika}
|
||||
|
||||
@ -735,6 +771,7 @@ Maxim Fedotov, Wargaming + Yuri Baranov, Яндекс.
|
||||
Нужно для БК. Декабрь 2019.
|
||||
В декабре для БК сделан минимальный вариант этой задачи.
|
||||
Максимальный вариант, вроде, никому не нужен.
|
||||
Upd. Всё ещё кажется, что задача не нужна.
|
||||
|
||||
### 8.22. Поддержка синтаксиса для переменных в стиле MySQL. {#podderzhka-sintaksisa-dlia-peremennykh-v-stile-mysql}
|
||||
|
||||
@ -746,6 +783,7 @@ Upd. Юрий Баранов работает в Google, там запрещен
|
||||
|
||||
Желательно 2.15.
|
||||
|
||||
|
||||
## 9. Безопасность. {#bezopasnost}
|
||||
|
||||
### 9.1. + Ограничение на хосты в запросах ко внешним системам. {#ogranichenie-na-khosty-v-zaprosakh-ko-vneshnim-sistemam}
|
||||
@ -762,6 +800,11 @@ ClickHouse предоставляет возможность обратитьс
|
||||
|
||||
### 9.3. Поддержка TLS для ZooKeeper. {#podderzhka-tls-dlia-zookeeper}
|
||||
|
||||
[#10174](https://github.com/ClickHouse/ClickHouse/issues/10174)
|
||||
|
||||
Есть pull request.
|
||||
|
||||
|
||||
## 10. Внешние словари. {#vneshnie-slovari}
|
||||
|
||||
### 10.1. + Исправление зависания в библиотеке доступа к YT. {#ispravlenie-zavisaniia-v-biblioteke-dostupa-k-yt}
|
||||
@ -777,6 +820,7 @@ ClickHouse предоставляет возможность обратитьс
|
||||
Нужно для БК и Метрики. Поиск причин - [Александр Сапин](https://github.com/alesapin). Дальшейшее исправление возможно на стороне YT.
|
||||
|
||||
Upd. Одну причину устранили, но ещё что-то неизвестное осталось.
|
||||
Upd. Нас заставляют переписать эту библиотеку с одного API на другое, так как старое внезапно устарело. Кажется, что переписывание случайно исправит все проблемы.
|
||||
|
||||
### 10.3. Возможность чтения данных из статических таблиц в YT словарях. {#vozmozhnost-chteniia-dannykh-iz-staticheskikh-tablits-v-yt-slovariakh}
|
||||
|
||||
@ -802,7 +846,7 @@ Upd. Одну причину устранили, но ещё что-то неи
|
||||
|
||||
Артём Стрельцов, Николай Дегтеринский, Наталия Михненко, ВШЭ.
|
||||
|
||||
### 10.9. Уменьшение блокировок для cache словарей за счёт одновременных запросов одного и того же. {#umenshenie-blokirovok-dlia-cache-slovarei-za-schiot-odnovremennykh-zaprosov-odnogo-i-togo-zhe}
|
||||
### 10.9. - Уменьшение блокировок для cache словарей за счёт одновременных запросов одного и того же. {#umenshenie-blokirovok-dlia-cache-slovarei-za-schiot-odnovremennykh-zaprosov-odnogo-i-togo-zhe}
|
||||
|
||||
Заменено в пользу 10.10, 10.11.
|
||||
|
||||
@ -825,7 +869,7 @@ Upd. Одну причину устранили, но ещё что-то неи
|
||||
|
||||
### 10.14. Поддержка всех типов в функции transform. {#podderzhka-vsekh-tipov-v-funktsii-transform}
|
||||
|
||||
Задачу взяла Ольга Хвостикова.
|
||||
Задачу взяла Ольга Хвостикова. Upd. Статус неизвестен.
|
||||
|
||||
### 10.15. Использование словарей как специализированного layout для Join. {#ispolzovanie-slovarei-kak-spetsializirovannogo-layout-dlia-join}
|
||||
|
||||
@ -843,6 +887,7 @@ Upd. Одну причину устранили, но ещё что-то неи
|
||||
|
||||
### 10.19. Возможность зарегистрировать некоторые функции, использующие словари, под пользовательскими именами. {#vozmozhnost-zaregistrirovat-nekotorye-funktsii-ispolzuiushchie-slovari-pod-polzovatelskimi-imenami}
|
||||
|
||||
|
||||
## 11. Интерфейсы. {#interfeisy}
|
||||
|
||||
### 11.1. Вставка состояний агрегатных функций в виде кортежа аргументов или массива кортежей аргументов. {#vstavka-sostoianii-agregatnykh-funktsii-v-vide-kortezha-argumentov-ili-massiva-kortezhei-argumentov}
|
||||
@ -851,6 +896,8 @@ Upd. Одну причину устранили, но ещё что-то неи
|
||||
|
||||
Нужно разобраться, как упаковывать Java в статический бинарник, возможно AppImage. Или предоставить максимально простую инструкцию по установке jdbc-bridge. Может быть будет заинтересован Александр Крашенинников, Badoo, так как он разработал jdbc-bridge.
|
||||
|
||||
Upd. Александр Крашенинников перешёл в другую компанию и больше не занимается этим.
|
||||
|
||||
### 11.3. + Интеграционные тесты ODBC драйвера путём подключения ClickHouse к самому себе через ODBC. {#integratsionnye-testy-odbc-draivera-putiom-podkliucheniia-clickhouse-k-samomu-sebe-cherez-odbc}
|
||||
|
||||
Михаил Филимонов, Altinity. Готово.
|
||||
@ -881,12 +928,13 @@ zhang2014, есть pull request.
|
||||
|
||||
Возможность описать в конфигурационном файле handler (путь в URL) для HTTP запросов к серверу, которому соответствует некоторый параметризованный запрос. Пользователь может вызвать этот обработчик и не должен передавать SQL запрос.
|
||||
|
||||
|
||||
## 12. Управление пользователями и доступом. {#upravlenie-polzovateliami-i-dostupom}
|
||||
|
||||
### 12.1. Role Based Access Control. {#role-based-access-control}
|
||||
### 12.1. + Role Based Access Control. {#role-based-access-control}
|
||||
|
||||
[Виталий Баранов](https://github.com/vitlibar). Финальная стадия разработки, рабочая версия в начале февраля 2019.
|
||||
Q1. Сейчас сделаны все интерфейсы в коде и запросы, но не сделаны варианты хранения прав кроме прототипа.
|
||||
[Виталий Баранов](https://github.com/vitlibar). Финальная стадия разработки, рабочая версия в начале апреля 2019.
|
||||
Q2. Сейчас сделаны все интерфейсы в коде и запросы, но не сделаны варианты хранения прав кроме прототипа.
|
||||
Upd. Сделано хранение прав. До готового к использованию состояния осталось несколько доработок.
|
||||
|
||||
### 12.2. + Управление пользователями и правами доступа с помощью SQL запросов. {#upravlenie-polzovateliami-i-pravami-dostupa-s-pomoshchiu-sql-zaprosov}
|
||||
@ -897,7 +945,7 @@ Q1. Сделано управление правами полностью, но
|
||||
### 12.3. Подключение справочника пользователей и прав доступа из LDAP. {#podkliuchenie-spravochnika-polzovatelei-i-prav-dostupa-iz-ldap}
|
||||
|
||||
[Виталий Баранов](https://github.com/vitlibar). Требует 12.1.
|
||||
Q1/Q2.
|
||||
Q2.
|
||||
|
||||
### 12.4. Подключение IDM системы Яндекса как справочника пользователей и прав доступа. {#podkliuchenie-idm-sistemy-iandeksa-kak-spravochnika-polzovatelei-i-prav-dostupa}
|
||||
|
||||
@ -911,6 +959,7 @@ Q1/Q2.
|
||||
|
||||
[Виталий Баранов](https://github.com/vitlibar). Требует 12.1.
|
||||
|
||||
|
||||
## 13. Разделение ресурсов, multi-tenancy. {#razdelenie-resursov-multi-tenancy}
|
||||
|
||||
### 13.1. Overcommit запросов по памяти и вытеснение. {#overcommit-zaprosov-po-pamiati-i-vytesnenie}
|
||||
@ -926,6 +975,8 @@ Q1/Q2.
|
||||
Требует 13.2 или сможем сделать более неудобную реализацию раньше.
|
||||
Обсуждается вариант неудобной реализации. Пока средний приоритет, целимся на Q1/Q2.
|
||||
Вариант реализации выбрал Александр Казаков.
|
||||
Upd. Не уследили, и задачу стали обсуждать менеджеры.
|
||||
|
||||
|
||||
## 14. Диалект SQL. {#dialekt-sql}
|
||||
|
||||
@ -936,8 +987,6 @@ Q1/Q2.
|
||||
|
||||
### 14.2. Поддержка WITH для подзапросов. {#podderzhka-with-dlia-podzaprosov}
|
||||
|
||||
Михаил Коротов.
|
||||
|
||||
### 14.3. Поддержка подстановок для множеств в правой части IN. {#podderzhka-podstanovok-dlia-mnozhestv-v-pravoi-chasti-in}
|
||||
|
||||
### 14.4. Поддержка подстановок для идентификаторов (имён) в SQL запросе. {#podderzhka-podstanovok-dlia-identifikatorov-imion-v-sql-zaprose}
|
||||
@ -993,7 +1042,7 @@ zhang2014
|
||||
|
||||
### 14.16. Синонимы для функций из MySQL. {#sinonimy-dlia-funktsii-iz-mysql}
|
||||
|
||||
### 14.17. Ввести понятие stateful функций. {#vvesti-poniatie-stateful-funktsii}
|
||||
### 14.17. + Ввести понятие stateful функций. {#vvesti-poniatie-stateful-funktsii}
|
||||
|
||||
zhang2014.
|
||||
Для runningDifference, neighbour - их учёт в оптимизаторе запросов.
|
||||
@ -1018,13 +1067,15 @@ zhang2014.
|
||||
|
||||
Павел Потёмкин, ВШЭ.
|
||||
|
||||
|
||||
## 15. Улучшение поддержки JOIN. {#uluchshenie-podderzhki-join}
|
||||
|
||||
### 15.1. Доведение merge JOIN до продакшена. {#dovedenie-merge-join-do-prodakshena}
|
||||
### 15.1. + Доведение merge JOIN до продакшена. {#dovedenie-merge-join-do-prodakshena}
|
||||
|
||||
Артём Зуйков. Сейчас merge JOIN включается вручную опцией и всегда замедляет запросы. Хотим, чтобы он замедлял запросы только когда это неизбежно.
|
||||
Кстати, смысл merge JOIN появляется только совместно с 15.2 и 15.3.
|
||||
Q1. Сделали адаптивный вариант, но вроде он что-то всё-ещё замедляет.
|
||||
Задача сделана, но всё работает слишком медленно.
|
||||
|
||||
### 15.1.1. Алгоритм two-level merge JOIN. {#algoritm-two-level-merge-join}
|
||||
|
||||
@ -1052,6 +1103,7 @@ Q1. Сделали адаптивный вариант, но вроде он ч
|
||||
|
||||
Артём Зуйков.
|
||||
|
||||
|
||||
## 16. Типы данных и функции. {#tipy-dannykh-i-funktsii}
|
||||
|
||||
### 16.1. + DateTime64. {#datetime64}
|
||||
@ -1073,6 +1125,7 @@ Upd. Секретного изменения в работе не будет, з
|
||||
|
||||
### 16.6. Функции нормализации и хэширования SQL запросов. {#funktsii-normalizatsii-i-kheshirovaniia-sql-zaprosov}
|
||||
|
||||
|
||||
## 17. Работа с географическими данными. {#rabota-s-geograficheskimi-dannymi}
|
||||
|
||||
### 17.1. Гео-словари для определения региона по координатам. {#geo-slovari-dlia-opredeleniia-regiona-po-koordinatam}
|
||||
@ -1105,6 +1158,7 @@ Upd. Андрей сделал прототип более оптимально
|
||||
|
||||
Сейчас функция тихо не работает в случае полигонов с самопересечениями, надо кидать исключение.
|
||||
|
||||
|
||||
## 18. Машинное обучение и статистика. {#mashinnoe-obuchenie-i-statistika}
|
||||
|
||||
### 18.1. Инкрементальная кластеризация данных. {#inkrementalnaia-klasterizatsiia-dannykh}
|
||||
@ -1123,6 +1177,7 @@ Upd. Андрей сделал прототип более оптимально
|
||||
|
||||
В очереди. Возможно, Александр Кожихов. У него сначала идёт задача 24.26.
|
||||
|
||||
|
||||
## 19. Улучшение работы кластера. {#uluchshenie-raboty-klastera}
|
||||
|
||||
### 19.1. Параллельные кворумные вставки без линеаризуемости. {#parallelnye-kvorumnye-vstavki-bez-linearizuemosti}
|
||||
@ -1153,7 +1208,7 @@ Upd. Алексей сделал какой-то вариант, но борет
|
||||
|
||||
Hold. Полезно для заказчиков внутри Яндекса, но есть риски. Эту задачу никто не будет делать.
|
||||
|
||||
### 19.4. internal\_replication = ‘auto’. {#internal-replication-auto}
|
||||
### 19.4. internal_replication = ‘auto’. {#internal-replication-auto}
|
||||
|
||||
### 19.5. Реплицируемые базы данных. {#replitsiruemye-bazy-dannykh}
|
||||
|
||||
@ -1177,18 +1232,20 @@ Hold. Полезно для заказчиков внутри Яндекса, н
|
||||
|
||||
Требует 1.6, 19.1, 19.6, 19.7, 19.8, 19.9.
|
||||
|
||||
|
||||
## 20. Мутации данных. {#mutatsii-dannykh}
|
||||
|
||||
Пока все задачи по точечным UPDATE/DELETE имеют низкий приоритет, но ожидаем взять в работу в середине 2020.
|
||||
|
||||
### 20.1. Поддержка DELETE путём запоминания множества затронутых кусков и ключей. {#podderzhka-delete-putiom-zapominaniia-mnozhestva-zatronutykh-kuskov-i-kliuchei}
|
||||
|
||||
### 20.2. Поддержка DELETE путём преобразования множества ключей в множество row\_numbers на реплике, столбца флагов и индекса по диапазонам. {#podderzhka-delete-putiom-preobrazovaniia-mnozhestva-kliuchei-v-mnozhestvo-row-numbers-na-replike-stolbtsa-flagov-i-indeksa-po-diapazonam}
|
||||
### 20.2. Поддержка DELETE путём преобразования множества ключей в множество row_numbers на реплике, столбца флагов и индекса по диапазонам. {#podderzhka-delete-putiom-preobrazovaniia-mnozhestva-kliuchei-v-mnozhestvo-row-numbers-na-replike-stolbtsa-flagov-i-indeksa-po-diapazonam}
|
||||
|
||||
### 20.3. Поддержка ленивых DELETE путём запоминания выражений и преобразования к множеству ключей в фоне. {#podderzhka-lenivykh-delete-putiom-zapominaniia-vyrazhenii-i-preobrazovaniia-k-mnozhestvu-kliuchei-v-fone}
|
||||
|
||||
### 20.4. Поддержка UPDATE с помощью преобразования в DELETE и вставок. {#podderzhka-update-s-pomoshchiu-preobrazovaniia-v-delete-i-vstavok}
|
||||
|
||||
|
||||
## 21. Оптимизации производительности. {#optimizatsii-proizvoditelnosti}
|
||||
|
||||
### 21.1. + Параллельный парсинг форматов. {#parallelnyi-parsing-formatov}
|
||||
@ -1201,7 +1258,7 @@ Hold. Полезно для заказчиков внутри Яндекса, н
|
||||
|
||||
После 21.1, предположительно Никита Михайлов. Задача сильно проще чем 21.1.
|
||||
|
||||
### 21.3. Исправление низкой производительности анализа индекса в случае большого множества в секции IN. {#ispravlenie-nizkoi-proizvoditelnosti-analiza-indeksa-v-sluchae-bolshogo-mnozhestva-v-sektsii-in}
|
||||
### 21.3. + Исправление низкой производительности анализа индекса в случае большого множества в секции IN. {#ispravlenie-nizkoi-proizvoditelnosti-analiza-indeksa-v-sluchae-bolshogo-mnozhestva-v-sektsii-in}
|
||||
|
||||
Нужно всем (Zen, БК, DataLens, TestEnv…). Антон Попов, Q1/Q2.
|
||||
|
||||
@ -1309,23 +1366,23 @@ Constraints позволяют задать выражение, истиннос
|
||||
|
||||
В ClickHouse используется неоптимальный вариант top sort. Суть его в том, что из каждого блока достаётся top N записей, а затем, все блоки мержатся. Но доставание top N записей у каждого следующего блока бессмысленно, если мы знаем, что из них в глобальный top N войдёт меньше. Конечно нужно реализовать вариацию на тему priority queue (heap) с быстрым пропуском целых блоков, если ни одна строка не попадёт в накопленный top.
|
||||
|
||||
1. Рекурсивный вариант сортировки по кортежам.
|
||||
2. Рекурсивный вариант сортировки по кортежам.
|
||||
|
||||
Для сортировки по кортежам используется обычная сортировка с компаратором, который в цикле по элементам кортежа делает виртуальные вызовы `IColumn::compareAt`. Это неоптимально - как из-за короткого цикла по неизвестному в compile-time количеству элементов, так и из-за виртуальных вызовов. Чтобы обойтись без виртуальных вызовов, есть метод `IColumn::getPermutation`. Он используется в случае сортировки по одному столбцу. Есть вариант, что в случае сортировки по кортежу, что-то похожее тоже можно применить… например, сделать метод `updatePermutation`, принимающий аргументы offset и limit, и допереставляющий перестановку в диапазоне значений, в которых предыдущий столбец имел равные значения.
|
||||
|
||||
1. RadixSort для сортировки.
|
||||
3. RadixSort для сортировки.
|
||||
|
||||
Один наш знакомый начал делать задачу по попытке использования RadixSort для сортировки столбцов. Был сделан вариант indirect сортировки (для `getPermutation`), но не оптимизирован до конца - есть лишние ненужные перекладывания элементов. Для того, чтобы его оптимизировать, придётся добавить немного шаблонной магии (на последнем шаге что-то не копировать, вместо перекладывания индексов - складывать их в готовое место). Также этот человек добавил метод MSD Radix Sort для реализации radix partial sort. Но даже не проверил производительность.
|
||||
|
||||
Наиболее содержательная часть задачи может состоять в применении Radix Sort для сортировки кортежей, расположенных в оперативке в виде Structure Of Arrays неизвестного в compile-time размера. Это может работать хуже, чем то, что описано в пункте 2… Но попробовать не помешает.
|
||||
|
||||
1. Three-way comparison sort.
|
||||
4. Three-way comparison sort.
|
||||
|
||||
Виртуальный метод `compareAt` возвращает -1, 0, 1. Но алгоритмы сортировки сравнениями обычно рассчитаны на `operator<` и не могут получить преимущества от three-way comparison. А можно ли написать так, чтобы преимущество было?
|
||||
|
||||
1. pdq partial sort
|
||||
5. pdq partial sort
|
||||
|
||||
Хороший алгоритм сортировки сравнениями `pdqsort` не имеет варианта partial sort. Заметим, что на практике, почти все сортировки в запросах ClickHouse являются partial\_sort, так как `ORDER BY` почти всегда идёт с `LIMIT`. Кстати, Данила Кутенин уже попробовал это и показал, что в тривиальном случае преимущества нет. Но не очевидно, что нельзя сделать лучше.
|
||||
Хороший алгоритм сортировки сравнениями `pdqsort` не имеет варианта partial sort. Заметим, что на практике, почти все сортировки в запросах ClickHouse являются partial_sort, так как `ORDER BY` почти всегда идёт с `LIMIT`. Кстати, Данила Кутенин уже попробовал это и показал, что в тривиальном случае преимущества нет. Но не очевидно, что нельзя сделать лучше.
|
||||
|
||||
### 21.20. Использование материализованных представлений для оптимизации запросов. {#ispolzovanie-materializovannykh-predstavlenii-dlia-optimizatsii-zaprosov}
|
||||
|
||||
@ -1344,6 +1401,7 @@ Constraints позволяют задать выражение, истиннос
|
||||
zhang2014.
|
||||
Есть pull request.
|
||||
|
||||
|
||||
## 22. Долги и недоделанные возможности. {#dolgi-i-nedodelannye-vozmozhnosti}
|
||||
|
||||
### 22.1. + Исправление неработающих таймаутов, если используется TLS. {#ispravlenie-nerabotaiushchikh-taimautov-esli-ispolzuetsia-tls}
|
||||
@ -1362,6 +1420,7 @@ N.Vartolomei.
|
||||
|
||||
Александр Казаков. Нужно для Яндекс.Метрики и Datalens. Задача постепенно тащится и исправлениями в соседних местах стала менее актуальна.
|
||||
В Q1 будет сделана или отменена с учётом 1.2. и 1.3.
|
||||
Upd. Добавили таймауты.
|
||||
|
||||
### 22.5. + Исправление редких срабатываний TSan в stress тестах в CI. {#ispravlenie-redkikh-srabatyvanii-tsan-v-stress-testakh-v-ci}
|
||||
|
||||
@ -1470,18 +1529,19 @@ Altinity.
|
||||
|
||||
[Александр Сапин](https://github.com/alesapin)
|
||||
|
||||
|
||||
## 23. Default Festival. {#default-festival}
|
||||
|
||||
### 23.1. + Включение minimalistic\_part\_header в ZooKeeper. {#vkliuchenie-minimalistic-part-header-v-zookeeper}
|
||||
### 23.1. + Включение minimalistic_part_header в ZooKeeper. {#vkliuchenie-minimalistic-part-header-v-zookeeper}
|
||||
|
||||
Сильно уменьшает объём данных в ZooKeeper. Уже год в продакшене в Яндекс.Метрике.
|
||||
Алексей Миловидов, ноябрь 2019.
|
||||
|
||||
### 23.2. Включение distributed\_aggregation\_memory\_efficient. {#vkliuchenie-distributed-aggregation-memory-efficient}
|
||||
### 23.2. Включение distributed_aggregation_memory_efficient. {#vkliuchenie-distributed-aggregation-memory-efficient}
|
||||
|
||||
Есть риски меньшей производительности лёгких запросов, хотя производительность тяжёлых запросов всегда увеличивается.
|
||||
|
||||
### 23.3. Включение min\_bytes\_to\_external\_sort и min\_bytes\_to\_external\_group\_by. {#vkliuchenie-min-bytes-to-external-sort-i-min-bytes-to-external-group-by}
|
||||
### 23.3. Включение min_bytes_to_external_sort и min_bytes_to_external_group_by. {#vkliuchenie-min-bytes-to-external-sort-i-min-bytes-to-external-group-by}
|
||||
|
||||
Желательно 5.2. и 13.1.
|
||||
|
||||
@ -1489,7 +1549,7 @@ Altinity.
|
||||
|
||||
Есть гипотеза, что плохо работает на очень больших кластерах.
|
||||
|
||||
### 23.5. Включение compile\_expressions. {#vkliuchenie-compile-expressions}
|
||||
### 23.5. Включение compile_expressions. {#vkliuchenie-compile-expressions}
|
||||
|
||||
Требует 7.2. Задачу изначально на 99% сделал Денис Скоробогатов, ВШЭ и Яндекс. Остальной процент доделывал Алексей Миловидов, а затем [Александр Сапин](https://github.com/alesapin).
|
||||
|
||||
@ -1514,6 +1574,7 @@ Q1. [Николай Кочетов](https://github.com/KochetovNicolai).
|
||||
Возможность mlock бинарника сделал Олег Алексеенков [\#3553](https://github.com/ClickHouse/ClickHouse/pull/3553)
|
||||
. Поможет, когда на серверах кроме ClickHouse работает много посторонних программ (мы иногда называем их в шутку «треш-программами»).
|
||||
|
||||
|
||||
## 24. Экспериментальные задачи. {#eksperimentalnye-zadachi}
|
||||
|
||||
### 24.1. Веб-интерфейс для просмотра состояния кластера и профилирования запросов. {#veb-interfeis-dlia-prosmotra-sostoianiia-klastera-i-profilirovaniia-zaprosov}
|
||||
@ -1553,7 +1614,7 @@ ClickHouse поддерживает LZ4 и ZSTD для сжатия данных
|
||||
|
||||
Смотрите также 24.5.
|
||||
|
||||
1. Шифрование отдельных значений.
|
||||
2. Шифрование отдельных значений.
|
||||
Для этого требуется реализовать функции шифрования и расшифрования, доступные из SQL. Для шифрования реализовать возможность добавления нужного количества случайных бит для исключения одинаковых зашифрованных значений на одинаковых данных. Это позволит реализовать возможность «забывания» данных без удаления строк таблицы: можно шифровать данные разных клиентов разными ключами, и для того, чтобы забыть данные одного клиента, потребуется всего лишь удалить ключ.
|
||||
|
||||
### 24.6. Userspace RAID. {#userspace-raid}
|
||||
@ -1586,7 +1647,7 @@ RAID позволяет одновременно увеличить надёжн
|
||||
|
||||
Дмитрий Ковальков, ВШЭ и Яндекс.
|
||||
|
||||
Подавляющее большинство кода ClickHouse написана для x86\_64 с набором инструкций до SSE 4.2 включительно. Лишь отдельные редкие функции поддерживают AVX/AVX2/AVX512 с динамической диспетчеризацией.
|
||||
Подавляющее большинство кода ClickHouse написана для x86_64 с набором инструкций до SSE 4.2 включительно. Лишь отдельные редкие функции поддерживают AVX/AVX2/AVX512 с динамической диспетчеризацией.
|
||||
|
||||
В первой части задачи, следует добавить в ClickHouse реализации некоторых примитивов, оптимизированные под более новый набор инструкций. Например, AVX2 реализацию генератора случайных чисел pcg: https://github.com/lemire/simdpcg
|
||||
|
||||
@ -1598,6 +1659,8 @@ RAID позволяет одновременно увеличить надёжн
|
||||
|
||||
Продолжение 24.8.
|
||||
|
||||
Upd. Есть pull request.
|
||||
|
||||
### 24.10. Поддержка типов half/bfloat16/unum. {#podderzhka-tipov-halfbfloat16unum}
|
||||
|
||||
[\#7657](https://github.com/ClickHouse/ClickHouse/issues/7657)
|
||||
@ -1633,6 +1696,7 @@ ClickHouse предоставляет достаточно богатый наб
|
||||
В компании nVidia сделали прототип offloading вычисления GROUP BY с некоторыми из агрегатных функций в ClickHouse и обещат предоставить исходники в публичный доступ для дальнейшего развития. Предлагается изучить этот прототип и расширить его применимость для более широкого сценария использования. В качестве альтернативы, предлагается изучить исходные коды системы `OmniSci` или `Alenka` или библиотеку `CUB` https://nvlabs.github.io/cub/ и применить некоторые из алгоритмов в ClickHouse.
|
||||
|
||||
Upd. В компании nVidia выложили прототип, теперь нужна интеграция в систему сборки.
|
||||
Upd. Интеграция в систему сборки - Иван Лежанкин.
|
||||
|
||||
### 24.13. Stream запросы. {#stream-zaprosy}
|
||||
|
||||
@ -1791,7 +1855,7 @@ Amos Bird, но его решение слишком громоздкое и п
|
||||
|
||||
### 25.10. Митапы в России и Беларуси: Москва x2 + митап для разработчиков или хакатон, Санкт-Петербург, Минск, Нижний Новгород, Екатеринбург, Новосибирск и/или Академгородок, Иннополис или Казань. {#mitapy-v-rossii-i-belarusi-moskva-x2-mitap-dlia-razrabotchikov-ili-khakaton-sankt-peterburg-minsk-nizhnii-novgorod-ekaterinburg-novosibirsk-iili-akademgorodok-innopolis-ili-kazan}
|
||||
|
||||
Екатерина - организация
|
||||
Екатерина - организация. Upd. Проведено два онлайн митапа на русском.
|
||||
|
||||
### 25.11. Митапы зарубежные: восток США (Нью Йорк, возможно Raleigh), возможно северо-запад (Сиэтл), Китай (Пекин снова, возможно митап для разработчиков или хакатон), Лондон. {#mitapy-zarubezhnye-vostok-ssha-niu-iork-vozmozhno-raleigh-vozmozhno-severo-zapad-sietl-kitai-pekin-snova-vozmozhno-mitap-dlia-razrabotchikov-ili-khakaton-london}
|
||||
|
||||
@ -1807,7 +1871,8 @@ Amos Bird, но его решение слишком громоздкое и п
|
||||
|
||||
### 25.14. Конференции в России: все HighLoad, возможно CodeFest, DUMP или UWDC, возможно C++ Russia. {#konferentsii-v-rossii-vse-highload-vozmozhno-codefest-dump-ili-uwdc-vozmozhno-c-russia}
|
||||
|
||||
Алексей Миловидов и все подготовленные докладчики
|
||||
Алексей Миловидов и все подготовленные докладчики.
|
||||
Upd. Есть Saint HighLoad online.
|
||||
|
||||
### 25.15. Конференции зарубежные: Percona, DataOps, попытка попасть на более крупные. {#konferentsii-zarubezhnye-percona-dataops-popytka-popast-na-bolee-krupnye}
|
||||
|
||||
@ -1848,7 +1913,7 @@ Amos Bird, но его решение слишком громоздкое и п
|
||||
|
||||
### 25.22. On-site помощь с ClickHouse компаниям в дни рядом с мероприятиями. {#on-site-pomoshch-s-clickhouse-kompaniiam-v-dni-riadom-s-meropriiatiiami}
|
||||
|
||||
[Иван Блинков](https://github.com/blinkov/) - организация
|
||||
[Иван Блинков](https://github.com/blinkov/) - организация. Проверил мероприятие для турецкой компании.
|
||||
|
||||
### 25.23. Новый мерч для ClickHouse. {#novyi-merch-dlia-clickhouse}
|
||||
|
||||
|
@ -1,669 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Учебник По Клик-Хаусу {#clickhouse-tutorial}
|
||||
|
||||
## Чего ожидать от этого урока? {#what-to-expect-from-this-tutorial}
|
||||
|
||||
Пройдя через этот учебник,вы узнаете, как настроить простой кластер ClickHouse. Он будет небольшим, но отказоустойчивым и масштабируемым. Затем мы будем использовать один из примеров наборов данных, чтобы заполнить его данными и выполнить некоторые демонстрационные запросы.
|
||||
|
||||
## Настройка Одного Узла {#single-node-setup}
|
||||
|
||||
Чтобы избежать сложностей распределенной среды, мы начнем с развертывания ClickHouse на одном сервере или виртуальной машине. ClickHouse обычно устанавливается из [дебютантка](install.md#install-from-deb-packages) или [оборотов в минуту](install.md#from-rpm-packages) пакеты, но есть и такие [альтернативы](install.md#from-docker-image) для операционных систем, которые их не поддерживают.
|
||||
|
||||
Например, вы выбрали `deb` пакеты и выполненные работы:
|
||||
|
||||
``` bash
|
||||
sudo apt-get install dirmngr
|
||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
|
||||
|
||||
echo "deb http://repo.clickhouse.tech/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
|
||||
sudo apt-get update
|
||||
|
||||
sudo apt-get install -y clickhouse-server clickhouse-client
|
||||
```
|
||||
|
||||
Что у нас есть в пакетах, которые были установлены:
|
||||
|
||||
- `clickhouse-client` пакет содержит [clickhouse-клиент](../interfaces/cli.md) приложение, интерактивный консольный клиент ClickHouse.
|
||||
- `clickhouse-common` пакет содержит исполняемый файл ClickHouse.
|
||||
- `clickhouse-server` пакет содержит файлы конфигурации для запуска ClickHouse в качестве сервера.
|
||||
|
||||
Файлы конфигурации сервера находятся в `/etc/clickhouse-server/`. Прежде чем идти дальше, пожалуйста, обратите внимание на `<path>` элемент в `config.xml`. Путь определяет место для хранения данных, поэтому он должен быть расположен на Томе с большой емкостью диска; значение по умолчанию равно `/var/lib/clickhouse/`. Если вы хотите настроить конфигурацию, то это не удобно для непосредственного редактирования `config.xml` файл, учитывая, что он может быть переписан при будущих обновлениях пакета. Рекомендуемый способ переопределения элементов конфигурации заключается в создании [файлы в конфигурации.D каталог](../operations/configuration_files.md) которые служат в качестве «patches» к конфигурации.XML.
|
||||
|
||||
Как вы могли заметить, `clickhouse-server` не запускается автоматически после установки пакета. Он также не будет автоматически перезапущен после обновления. То, как вы запускаете сервер, зависит от вашей системы init, как правило, это так:
|
||||
|
||||
``` bash
|
||||
sudo service clickhouse-server start
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
``` bash
|
||||
sudo /etc/init.d/clickhouse-server start
|
||||
```
|
||||
|
||||
По умолчанию для журналов сервера используется следующее расположение `/var/log/clickhouse-server/`. Сервер готов к обработке клиентских подключений, как только он регистрирует `Ready for connections` сообщение.
|
||||
|
||||
Как только это произойдет `clickhouse-server` все готово и работает, мы можем использовать `clickhouse-client` чтобы подключиться к серверу и выполнить некоторые тестовые запросы, такие как `SELECT "Hello, world!";`.
|
||||
|
||||
<details markdown="1">
|
||||
|
||||
<summary>Быстрые советы для clickhouse-клиента</summary>
|
||||
Интерактивный режим:
|
||||
|
||||
``` bash
|
||||
clickhouse-client
|
||||
clickhouse-client --host=... --port=... --user=... --password=...
|
||||
```
|
||||
|
||||
Включить многострочные запросы:
|
||||
|
||||
``` bash
|
||||
clickhouse-client -m
|
||||
clickhouse-client --multiline
|
||||
```
|
||||
|
||||
Запуск запросов в пакетном режиме:
|
||||
|
||||
``` bash
|
||||
clickhouse-client --query='SELECT 1'
|
||||
echo 'SELECT 1' | clickhouse-client
|
||||
clickhouse-client <<< 'SELECT 1'
|
||||
```
|
||||
|
||||
Вставка данных из файла в заданном формате:
|
||||
|
||||
``` bash
|
||||
clickhouse-client --query='INSERT INTO table VALUES' < data.txt
|
||||
clickhouse-client --query='INSERT INTO table FORMAT TabSeparated' < data.tsv
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Импорт Образца Набора Данных {#import-sample-dataset}
|
||||
|
||||
Теперь пришло время заполнить наш сервер ClickHouse некоторыми образцами данных. В этом уроке мы будем использовать анонимизированные данные Яндекса.Metrica, первый сервис, который запускает ClickHouse в производственном режиме до того, как он стал открытым исходным кодом (подробнее об этом в [раздел истории](../introduction/history.md)). Есть [несколько способов импорта Яндекса.Набор метрика](example_datasets/metrica.md), и ради учебника мы пойдем с самым реалистичным из них.
|
||||
|
||||
### Загрузка и извлечение данных таблицы {#download-and-extract-table-data}
|
||||
|
||||
``` bash
|
||||
curl https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
|
||||
curl https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv
|
||||
```
|
||||
|
||||
Извлеченные файлы имеют размер около 10 ГБ.
|
||||
|
||||
### Создавать таблицы {#create-tables}
|
||||
|
||||
Как и в большинстве систем управления базами данных, ClickHouse логически группирует таблицы в «databases». Там есть еще один `default` база данных, но мы создадим новую с именем `tutorial`:
|
||||
|
||||
``` bash
|
||||
clickhouse-client --query "CREATE DATABASE IF NOT EXISTS tutorial"
|
||||
```
|
||||
|
||||
Синтаксис для создания таблиц намного сложнее по сравнению с базами данных (см. [ссылка](../sql_reference/statements/create.md). В общем `CREATE TABLE` в заявлении должны быть указаны три ключевых момента:
|
||||
|
||||
1. Имя таблицы для создания.
|
||||
2. Table schema, i.e. list of columns and their [тип данных](../sql_reference/data_types/index.md).
|
||||
3. [Настольный двигатель](../engines/table_engines/index.md) и это настройки, которые определяют все детали того, как запросы к этой таблице будут физически выполняться.
|
||||
|
||||
Яндекс.Metrica - это сервис веб-аналитики, и пример набора данных не охватывает его полную функциональность, поэтому для создания необходимо создать только две таблицы:
|
||||
|
||||
- `hits` это таблица с каждым действием, выполняемым всеми пользователями на всех веб-сайтах, охватываемых сервисом.
|
||||
- `visits` это таблица, которая содержит предварительно построенные сеансы вместо отдельных действий.
|
||||
|
||||
Давайте посмотрим и выполним реальные запросы create table для этих таблиц:
|
||||
|
||||
``` sql
|
||||
CREATE TABLE tutorial.hits_v1
|
||||
(
|
||||
`WatchID` UInt64,
|
||||
`JavaEnable` UInt8,
|
||||
`Title` String,
|
||||
`GoodEvent` Int16,
|
||||
`EventTime` DateTime,
|
||||
`EventDate` Date,
|
||||
`CounterID` UInt32,
|
||||
`ClientIP` UInt32,
|
||||
`ClientIP6` FixedString(16),
|
||||
`RegionID` UInt32,
|
||||
`UserID` UInt64,
|
||||
`CounterClass` Int8,
|
||||
`OS` UInt8,
|
||||
`UserAgent` UInt8,
|
||||
`URL` String,
|
||||
`Referer` String,
|
||||
`URLDomain` String,
|
||||
`RefererDomain` String,
|
||||
`Refresh` UInt8,
|
||||
`IsRobot` UInt8,
|
||||
`RefererCategories` Array(UInt16),
|
||||
`URLCategories` Array(UInt16),
|
||||
`URLRegions` Array(UInt32),
|
||||
`RefererRegions` Array(UInt32),
|
||||
`ResolutionWidth` UInt16,
|
||||
`ResolutionHeight` UInt16,
|
||||
`ResolutionDepth` UInt8,
|
||||
`FlashMajor` UInt8,
|
||||
`FlashMinor` UInt8,
|
||||
`FlashMinor2` String,
|
||||
`NetMajor` UInt8,
|
||||
`NetMinor` UInt8,
|
||||
`UserAgentMajor` UInt16,
|
||||
`UserAgentMinor` FixedString(2),
|
||||
`CookieEnable` UInt8,
|
||||
`JavascriptEnable` UInt8,
|
||||
`IsMobile` UInt8,
|
||||
`MobilePhone` UInt8,
|
||||
`MobilePhoneModel` String,
|
||||
`Params` String,
|
||||
`IPNetworkID` UInt32,
|
||||
`TraficSourceID` Int8,
|
||||
`SearchEngineID` UInt16,
|
||||
`SearchPhrase` String,
|
||||
`AdvEngineID` UInt8,
|
||||
`IsArtifical` UInt8,
|
||||
`WindowClientWidth` UInt16,
|
||||
`WindowClientHeight` UInt16,
|
||||
`ClientTimeZone` Int16,
|
||||
`ClientEventTime` DateTime,
|
||||
`SilverlightVersion1` UInt8,
|
||||
`SilverlightVersion2` UInt8,
|
||||
`SilverlightVersion3` UInt32,
|
||||
`SilverlightVersion4` UInt16,
|
||||
`PageCharset` String,
|
||||
`CodeVersion` UInt32,
|
||||
`IsLink` UInt8,
|
||||
`IsDownload` UInt8,
|
||||
`IsNotBounce` UInt8,
|
||||
`FUniqID` UInt64,
|
||||
`HID` UInt32,
|
||||
`IsOldCounter` UInt8,
|
||||
`IsEvent` UInt8,
|
||||
`IsParameter` UInt8,
|
||||
`DontCountHits` UInt8,
|
||||
`WithHash` UInt8,
|
||||
`HitColor` FixedString(1),
|
||||
`UTCEventTime` DateTime,
|
||||
`Age` UInt8,
|
||||
`Sex` UInt8,
|
||||
`Income` UInt8,
|
||||
`Interests` UInt16,
|
||||
`Robotness` UInt8,
|
||||
`GeneralInterests` Array(UInt16),
|
||||
`RemoteIP` UInt32,
|
||||
`RemoteIP6` FixedString(16),
|
||||
`WindowName` Int32,
|
||||
`OpenerName` Int32,
|
||||
`HistoryLength` Int16,
|
||||
`BrowserLanguage` FixedString(2),
|
||||
`BrowserCountry` FixedString(2),
|
||||
`SocialNetwork` String,
|
||||
`SocialAction` String,
|
||||
`HTTPError` UInt16,
|
||||
`SendTiming` Int32,
|
||||
`DNSTiming` Int32,
|
||||
`ConnectTiming` Int32,
|
||||
`ResponseStartTiming` Int32,
|
||||
`ResponseEndTiming` Int32,
|
||||
`FetchTiming` Int32,
|
||||
`RedirectTiming` Int32,
|
||||
`DOMInteractiveTiming` Int32,
|
||||
`DOMContentLoadedTiming` Int32,
|
||||
`DOMCompleteTiming` Int32,
|
||||
`LoadEventStartTiming` Int32,
|
||||
`LoadEventEndTiming` Int32,
|
||||
`NSToDOMContentLoadedTiming` Int32,
|
||||
`FirstPaintTiming` Int32,
|
||||
`RedirectCount` Int8,
|
||||
`SocialSourceNetworkID` UInt8,
|
||||
`SocialSourcePage` String,
|
||||
`ParamPrice` Int64,
|
||||
`ParamOrderID` String,
|
||||
`ParamCurrency` FixedString(3),
|
||||
`ParamCurrencyID` UInt16,
|
||||
`GoalsReached` Array(UInt32),
|
||||
`OpenstatServiceName` String,
|
||||
`OpenstatCampaignID` String,
|
||||
`OpenstatAdID` String,
|
||||
`OpenstatSourceID` String,
|
||||
`UTMSource` String,
|
||||
`UTMMedium` String,
|
||||
`UTMCampaign` String,
|
||||
`UTMContent` String,
|
||||
`UTMTerm` String,
|
||||
`FromTag` String,
|
||||
`HasGCLID` UInt8,
|
||||
`RefererHash` UInt64,
|
||||
`URLHash` UInt64,
|
||||
`CLID` UInt32,
|
||||
`YCLID` UInt64,
|
||||
`ShareService` String,
|
||||
`ShareURL` String,
|
||||
`ShareTitle` String,
|
||||
`ParsedParams` Nested(
|
||||
Key1 String,
|
||||
Key2 String,
|
||||
Key3 String,
|
||||
Key4 String,
|
||||
Key5 String,
|
||||
ValueDouble Float64),
|
||||
`IslandID` FixedString(16),
|
||||
`RequestNum` UInt32,
|
||||
`RequestTry` UInt8
|
||||
)
|
||||
ENGINE = MergeTree()
|
||||
PARTITION BY toYYYYMM(EventDate)
|
||||
ORDER BY (CounterID, EventDate, intHash32(UserID))
|
||||
SAMPLE BY intHash32(UserID)
|
||||
SETTINGS index_granularity = 8192
|
||||
```
|
||||
|
||||
``` sql
|
||||
CREATE TABLE tutorial.visits_v1
|
||||
(
|
||||
`CounterID` UInt32,
|
||||
`StartDate` Date,
|
||||
`Sign` Int8,
|
||||
`IsNew` UInt8,
|
||||
`VisitID` UInt64,
|
||||
`UserID` UInt64,
|
||||
`StartTime` DateTime,
|
||||
`Duration` UInt32,
|
||||
`UTCStartTime` DateTime,
|
||||
`PageViews` Int32,
|
||||
`Hits` Int32,
|
||||
`IsBounce` UInt8,
|
||||
`Referer` String,
|
||||
`StartURL` String,
|
||||
`RefererDomain` String,
|
||||
`StartURLDomain` String,
|
||||
`EndURL` String,
|
||||
`LinkURL` String,
|
||||
`IsDownload` UInt8,
|
||||
`TraficSourceID` Int8,
|
||||
`SearchEngineID` UInt16,
|
||||
`SearchPhrase` String,
|
||||
`AdvEngineID` UInt8,
|
||||
`PlaceID` Int32,
|
||||
`RefererCategories` Array(UInt16),
|
||||
`URLCategories` Array(UInt16),
|
||||
`URLRegions` Array(UInt32),
|
||||
`RefererRegions` Array(UInt32),
|
||||
`IsYandex` UInt8,
|
||||
`GoalReachesDepth` Int32,
|
||||
`GoalReachesURL` Int32,
|
||||
`GoalReachesAny` Int32,
|
||||
`SocialSourceNetworkID` UInt8,
|
||||
`SocialSourcePage` String,
|
||||
`MobilePhoneModel` String,
|
||||
`ClientEventTime` DateTime,
|
||||
`RegionID` UInt32,
|
||||
`ClientIP` UInt32,
|
||||
`ClientIP6` FixedString(16),
|
||||
`RemoteIP` UInt32,
|
||||
`RemoteIP6` FixedString(16),
|
||||
`IPNetworkID` UInt32,
|
||||
`SilverlightVersion3` UInt32,
|
||||
`CodeVersion` UInt32,
|
||||
`ResolutionWidth` UInt16,
|
||||
`ResolutionHeight` UInt16,
|
||||
`UserAgentMajor` UInt16,
|
||||
`UserAgentMinor` UInt16,
|
||||
`WindowClientWidth` UInt16,
|
||||
`WindowClientHeight` UInt16,
|
||||
`SilverlightVersion2` UInt8,
|
||||
`SilverlightVersion4` UInt16,
|
||||
`FlashVersion3` UInt16,
|
||||
`FlashVersion4` UInt16,
|
||||
`ClientTimeZone` Int16,
|
||||
`OS` UInt8,
|
||||
`UserAgent` UInt8,
|
||||
`ResolutionDepth` UInt8,
|
||||
`FlashMajor` UInt8,
|
||||
`FlashMinor` UInt8,
|
||||
`NetMajor` UInt8,
|
||||
`NetMinor` UInt8,
|
||||
`MobilePhone` UInt8,
|
||||
`SilverlightVersion1` UInt8,
|
||||
`Age` UInt8,
|
||||
`Sex` UInt8,
|
||||
`Income` UInt8,
|
||||
`JavaEnable` UInt8,
|
||||
`CookieEnable` UInt8,
|
||||
`JavascriptEnable` UInt8,
|
||||
`IsMobile` UInt8,
|
||||
`BrowserLanguage` UInt16,
|
||||
`BrowserCountry` UInt16,
|
||||
`Interests` UInt16,
|
||||
`Robotness` UInt8,
|
||||
`GeneralInterests` Array(UInt16),
|
||||
`Params` Array(String),
|
||||
`Goals` Nested(
|
||||
ID UInt32,
|
||||
Serial UInt32,
|
||||
EventTime DateTime,
|
||||
Price Int64,
|
||||
OrderID String,
|
||||
CurrencyID UInt32),
|
||||
`WatchIDs` Array(UInt64),
|
||||
`ParamSumPrice` Int64,
|
||||
`ParamCurrency` FixedString(3),
|
||||
`ParamCurrencyID` UInt16,
|
||||
`ClickLogID` UInt64,
|
||||
`ClickEventID` Int32,
|
||||
`ClickGoodEvent` Int32,
|
||||
`ClickEventTime` DateTime,
|
||||
`ClickPriorityID` Int32,
|
||||
`ClickPhraseID` Int32,
|
||||
`ClickPageID` Int32,
|
||||
`ClickPlaceID` Int32,
|
||||
`ClickTypeID` Int32,
|
||||
`ClickResourceID` Int32,
|
||||
`ClickCost` UInt32,
|
||||
`ClickClientIP` UInt32,
|
||||
`ClickDomainID` UInt32,
|
||||
`ClickURL` String,
|
||||
`ClickAttempt` UInt8,
|
||||
`ClickOrderID` UInt32,
|
||||
`ClickBannerID` UInt32,
|
||||
`ClickMarketCategoryID` UInt32,
|
||||
`ClickMarketPP` UInt32,
|
||||
`ClickMarketCategoryName` String,
|
||||
`ClickMarketPPName` String,
|
||||
`ClickAWAPSCampaignName` String,
|
||||
`ClickPageName` String,
|
||||
`ClickTargetType` UInt16,
|
||||
`ClickTargetPhraseID` UInt64,
|
||||
`ClickContextType` UInt8,
|
||||
`ClickSelectType` Int8,
|
||||
`ClickOptions` String,
|
||||
`ClickGroupBannerID` Int32,
|
||||
`OpenstatServiceName` String,
|
||||
`OpenstatCampaignID` String,
|
||||
`OpenstatAdID` String,
|
||||
`OpenstatSourceID` String,
|
||||
`UTMSource` String,
|
||||
`UTMMedium` String,
|
||||
`UTMCampaign` String,
|
||||
`UTMContent` String,
|
||||
`UTMTerm` String,
|
||||
`FromTag` String,
|
||||
`HasGCLID` UInt8,
|
||||
`FirstVisit` DateTime,
|
||||
`PredLastVisit` Date,
|
||||
`LastVisit` Date,
|
||||
`TotalVisits` UInt32,
|
||||
`TraficSource` Nested(
|
||||
ID Int8,
|
||||
SearchEngineID UInt16,
|
||||
AdvEngineID UInt8,
|
||||
PlaceID UInt16,
|
||||
SocialSourceNetworkID UInt8,
|
||||
Domain String,
|
||||
SearchPhrase String,
|
||||
SocialSourcePage String),
|
||||
`Attendance` FixedString(16),
|
||||
`CLID` UInt32,
|
||||
`YCLID` UInt64,
|
||||
`NormalizedRefererHash` UInt64,
|
||||
`SearchPhraseHash` UInt64,
|
||||
`RefererDomainHash` UInt64,
|
||||
`NormalizedStartURLHash` UInt64,
|
||||
`StartURLDomainHash` UInt64,
|
||||
`NormalizedEndURLHash` UInt64,
|
||||
`TopLevelDomain` UInt64,
|
||||
`URLScheme` UInt64,
|
||||
`OpenstatServiceNameHash` UInt64,
|
||||
`OpenstatCampaignIDHash` UInt64,
|
||||
`OpenstatAdIDHash` UInt64,
|
||||
`OpenstatSourceIDHash` UInt64,
|
||||
`UTMSourceHash` UInt64,
|
||||
`UTMMediumHash` UInt64,
|
||||
`UTMCampaignHash` UInt64,
|
||||
`UTMContentHash` UInt64,
|
||||
`UTMTermHash` UInt64,
|
||||
`FromHash` UInt64,
|
||||
`WebVisorEnabled` UInt8,
|
||||
`WebVisorActivity` UInt32,
|
||||
`ParsedParams` Nested(
|
||||
Key1 String,
|
||||
Key2 String,
|
||||
Key3 String,
|
||||
Key4 String,
|
||||
Key5 String,
|
||||
ValueDouble Float64),
|
||||
`Market` Nested(
|
||||
Type UInt8,
|
||||
GoalID UInt32,
|
||||
OrderID String,
|
||||
OrderPrice Int64,
|
||||
PP UInt32,
|
||||
DirectPlaceID UInt32,
|
||||
DirectOrderID UInt32,
|
||||
DirectBannerID UInt32,
|
||||
GoodID String,
|
||||
GoodName String,
|
||||
GoodQuantity Int32,
|
||||
GoodPrice Int64),
|
||||
`IslandID` FixedString(16)
|
||||
)
|
||||
ENGINE = CollapsingMergeTree(Sign)
|
||||
PARTITION BY toYYYYMM(StartDate)
|
||||
ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID)
|
||||
SAMPLE BY intHash32(UserID)
|
||||
SETTINGS index_granularity = 8192
|
||||
```
|
||||
|
||||
Вы можете выполнить эти запросы с помощью интерактивного режима `clickhouse-client` (просто запустите его в терминале, не указывая заранее запрос) или попробуйте некоторые [альтернативный интерфейс](../interfaces/index.md) если ты хочешь.
|
||||
|
||||
Как мы видим, `hits_v1` использует [базовый движок MergeTree](../engines/table_engines/mergetree_family/mergetree.md), в то время как `visits_v1` использует [Разрушение](../engines/table_engines/mergetree_family/collapsingmergetree.md) вариант.
|
||||
|
||||
### Импортировать данные {#import-data}
|
||||
|
||||
Импорт данных в ClickHouse осуществляется через [INSERT INTO](../sql_reference/statements/insert_into.md) запрос, как и во многих других базах данных SQL. Однако данные обычно приводятся в одном из следующих документов: [поддерживаемые форматы сериализации](../interfaces/formats.md) вместо `VALUES` предложение (которое также поддерживается).
|
||||
|
||||
Файлы, которые мы загрузили ранее, находятся в формате с разделенными вкладками, поэтому вот как импортировать их через консольный клиент:
|
||||
|
||||
``` bash
|
||||
clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv
|
||||
clickhouse-client --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv
|
||||
```
|
||||
|
||||
У ClickHouse их очень много [настройки для настройки](../operations/settings/index.md) и один из способов указать их в консольном клиенте - это через аргументы, как мы видим с помощью `--max_insert_block_size`. Самый простой способ выяснить, какие настройки доступны, что они означают и каковы значения по умолчанию, - это запросить `system.settings` стол:
|
||||
|
||||
``` sql
|
||||
SELECT name, value, changed, description
|
||||
FROM system.settings
|
||||
WHERE name LIKE '%max_insert_b%'
|
||||
FORMAT TSV
|
||||
|
||||
max_insert_block_size 1048576 0 "The maximum block size for insertion, if we control the creation of blocks for insertion."
|
||||
```
|
||||
|
||||
По желанию вы можете [OPTIMIZE](../sql_reference/misc/#misc_operations-optimize) таблицы после импорта. Таблицы, настроенные с помощью движка из семейства MergeTree, всегда выполняют слияние частей данных в фоновом режиме для оптимизации хранения данных (или, по крайней мере, проверяют, имеет ли это смысл). Эти запросы заставляют механизм таблиц выполнять оптимизацию хранилища прямо сейчас, а не некоторое время спустя:
|
||||
|
||||
``` bash
|
||||
clickhouse-client --query "OPTIMIZE TABLE tutorial.hits_v1 FINAL"
|
||||
clickhouse-client --query "OPTIMIZE TABLE tutorial.visits_v1 FINAL"
|
||||
```
|
||||
|
||||
Эти запросы запускают интенсивную работу ввода-вывода и процессора, поэтому, если таблица постоянно получает новые данные, лучше оставить ее в покое и позволить слияниям работать в фоновом режиме.
|
||||
|
||||
Теперь мы можем проверить, был ли импорт таблицы успешным:
|
||||
|
||||
``` bash
|
||||
clickhouse-client --query "SELECT COUNT(*) FROM tutorial.hits_v1"
|
||||
clickhouse-client --query "SELECT COUNT(*) FROM tutorial.visits_v1"
|
||||
```
|
||||
|
||||
## Пример запроса {#example-queries}
|
||||
|
||||
``` sql
|
||||
SELECT
|
||||
StartURL AS URL,
|
||||
AVG(Duration) AS AvgDuration
|
||||
FROM tutorial.visits_v1
|
||||
WHERE StartDate BETWEEN '2014-03-23' AND '2014-03-30'
|
||||
GROUP BY URL
|
||||
ORDER BY AvgDuration DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
``` sql
|
||||
SELECT
|
||||
sum(Sign) AS visits,
|
||||
sumIf(Sign, has(Goals.ID, 1105530)) AS goal_visits,
|
||||
(100. * goal_visits) / visits AS goal_percent
|
||||
FROM tutorial.visits_v1
|
||||
WHERE (CounterID = 912887) AND (toYYYYMM(StartDate) = 201403) AND (domain(StartURL) = 'yandex.ru')
|
||||
```
|
||||
|
||||
## Развертывание Кластера {#cluster-deployment}
|
||||
|
||||
Кластер ClickHouse-это однородный кластер. Шаги для настройки:
|
||||
|
||||
1. Установите сервер ClickHouse на всех компьютерах кластера
|
||||
2. Настройка конфигураций кластера в файлах конфигурации
|
||||
3. Создание локальных таблиц на каждом экземпляре
|
||||
4. Создать [Распространены таблицы](../engines/table_engines/special/distributed.md)
|
||||
|
||||
[Распространены таблицы](../engines/table_engines/special/distributed.md) это на самом деле своего рода «view» к локальным таблицам кластера ClickHouse. Запрос SELECT из распределенной таблицы выполняется с использованием ресурсов всех сегментов кластера. Вы можете указать конфигурации для нескольких кластеров и создать несколько распределенных таблиц, предоставляющих представления для разных кластеров.
|
||||
|
||||
Пример конфигурации для кластера с тремя сегментами, по одной реплике в каждом:
|
||||
|
||||
``` xml
|
||||
<remote_servers>
|
||||
<perftest_3shards_1replicas>
|
||||
<shard>
|
||||
<replica>
|
||||
<host>example-perftest01j.yandex.ru</host>
|
||||
<port>9000</port>
|
||||
</replica>
|
||||
</shard>
|
||||
<shard>
|
||||
<replica>
|
||||
<host>example-perftest02j.yandex.ru</host>
|
||||
<port>9000</port>
|
||||
</replica>
|
||||
</shard>
|
||||
<shard>
|
||||
<replica>
|
||||
<host>example-perftest03j.yandex.ru</host>
|
||||
<port>9000</port>
|
||||
</replica>
|
||||
</shard>
|
||||
</perftest_3shards_1replicas>
|
||||
</remote_servers>
|
||||
```
|
||||
|
||||
Для дальнейшей демонстрации давайте создадим новую локальную таблицу с тем же именем `CREATE TABLE` запрос, который мы использовали для `hits_v1`, но другое имя таблицы:
|
||||
|
||||
``` sql
|
||||
CREATE TABLE tutorial.hits_local (...) ENGINE = MergeTree() ...
|
||||
```
|
||||
|
||||
Создание распределенной таблицы, предоставляющей представление в локальные таблицы кластера:
|
||||
|
||||
``` sql
|
||||
CREATE TABLE tutorial.hits_all AS tutorial.hits_local
|
||||
ENGINE = Distributed(perftest_3shards_1replicas, tutorial, hits_local, rand());
|
||||
```
|
||||
|
||||
Распространенной практикой является создание одинаковых распределенных таблиц на всех машинах кластера. Он позволяет выполнять распределенные запросы на любой машине кластера. Кроме того, существует альтернативный вариант создания временной распределенной таблицы для данного запроса SELECT с помощью [удаленный](../sql_reference/table_functions/remote.md) табличная функция.
|
||||
|
||||
Давай убежим [INSERT SELECT](../sql_reference/statements/insert_into.md) в распределенную таблицу, чтобы распространить таблицу на несколько серверов.
|
||||
|
||||
``` sql
|
||||
INSERT INTO tutorial.hits_all SELECT * FROM tutorial.hits_v1;
|
||||
```
|
||||
|
||||
!!! warning "Уведомление"
|
||||
Такой подход не подходит для сегментации больших столов. Есть отдельный инструмент [clickhouse-копировальный аппарат](../operations/utilities/clickhouse-copier.md) это может повторно осколить произвольные большие таблицы.
|
||||
|
||||
Как и следовало ожидать, вычислительно тяжелые запросы выполняются в N раз быстрее, если они используют 3 сервера вместо одного.
|
||||
|
||||
В этом случае мы использовали кластер с 3 осколками, и каждый из них содержит одну реплику.
|
||||
|
||||
Для обеспечения устойчивости в рабочей среде рекомендуется, чтобы каждый сегмент содержал 2-3 реплики, распределенные между несколькими зонами доступности или центрами обработки данных (или, по крайней мере, стойками). Обратите внимание, что ClickHouse поддерживает неограниченное количество реплик.
|
||||
|
||||
Пример конфигурации для кластера из одного осколка, содержащего три реплики:
|
||||
|
||||
``` xml
|
||||
<remote_servers>
|
||||
...
|
||||
<perftest_1shards_3replicas>
|
||||
<shard>
|
||||
<replica>
|
||||
<host>example-perftest01j.yandex.ru</host>
|
||||
<port>9000</port>
|
||||
</replica>
|
||||
<replica>
|
||||
<host>example-perftest02j.yandex.ru</host>
|
||||
<port>9000</port>
|
||||
</replica>
|
||||
<replica>
|
||||
<host>example-perftest03j.yandex.ru</host>
|
||||
<port>9000</port>
|
||||
</replica>
|
||||
</shard>
|
||||
</perftest_1shards_3replicas>
|
||||
</remote_servers>
|
||||
```
|
||||
|
||||
Чтобы включить собственную репликацию [Смотритель зоопарка](http://zookeeper.apache.org/) требуемый. ClickHouse заботится о согласованности данных во всех репликах и автоматически запускает процедуру восстановления после сбоя. Рекомендуется развернуть кластер ZooKeeper на отдельных серверах (где не выполняются никакие другие процессы, включая ClickHouse).
|
||||
|
||||
!!! note "Примечание"
|
||||
ZooKeeper не является строгим требованием: в некоторых простых случаях вы можете дублировать данные, записав их во все реплики из кода вашего приложения. Такой подход является **нет** рекомендуется, чтобы в этом случае ClickHouse не мог гарантировать согласованность данных на всех репликах. Таким образом, это становится ответственностью вашего приложения.
|
||||
|
||||
Расположение ZooKeeper указано в конфигурационном файле:
|
||||
|
||||
``` xml
|
||||
<zookeeper>
|
||||
<node>
|
||||
<host>zoo01.yandex.ru</host>
|
||||
<port>2181</port>
|
||||
</node>
|
||||
<node>
|
||||
<host>zoo02.yandex.ru</host>
|
||||
<port>2181</port>
|
||||
</node>
|
||||
<node>
|
||||
<host>zoo03.yandex.ru</host>
|
||||
<port>2181</port>
|
||||
</node>
|
||||
</zookeeper>
|
||||
```
|
||||
|
||||
Кроме того, нам нужно установить макросы для идентификации каждого осколка и реплики, которые используются при создании таблицы:
|
||||
|
||||
``` xml
|
||||
<macros>
|
||||
<shard>01</shard>
|
||||
<replica>01</replica>
|
||||
</macros>
|
||||
```
|
||||
|
||||
Если в данный момент при создании реплицированной таблицы реплик нет, то создается новая первая реплика. Если уже существуют живые реплики, то новая реплика клонирует данные из существующих. У вас есть возможность сначала создать все реплицированные таблицы, а затем вставить в них данные. Другой вариант-создать некоторые реплики и добавить другие после или во время вставки данных.
|
||||
|
||||
``` sql
|
||||
CREATE TABLE tutorial.hits_replica (...)
|
||||
ENGINE = ReplcatedMergeTree(
|
||||
'/clickhouse_perftest/tables/{shard}/hits',
|
||||
'{replica}'
|
||||
)
|
||||
...
|
||||
```
|
||||
|
||||
Здесь мы используем [ReplicatedMergeTree](../engines/table_engines/mergetree_family/replication.md) настольный двигатель. В параметрах мы указываем путь ZooKeeper, содержащий идентификаторы сегментов и реплик.
|
||||
|
||||
``` sql
|
||||
INSERT INTO tutorial.hits_replica SELECT * FROM tutorial.hits_local;
|
||||
```
|
||||
|
||||
Репликация работает в режиме мульти-мастер. Данные могут быть загружены в любую реплику, а затем система автоматически синхронизирует их с другими экземплярами. Репликация является асинхронной, поэтому в данный момент не все реплики могут содержать недавно вставленные данные. По крайней мере, одна реплика должна быть готова, чтобы обеспечить прием данных. Другие будут синхронизировать данные и восстанавливать согласованность, как только они снова станут активными. Обратите внимание, что этот подход допускает низкую вероятность потери недавно вставленных данных.
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/getting_started/tutorial/) <!--hide-->
|
1
docs/ru/getting_started/tutorial.md
Symbolic link
1
docs/ru/getting_started/tutorial.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/getting_started/tutorial.md
|
@ -1,80 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Усыновители ClickHouse {#clickhouse-adopters}
|
||||
|
||||
!!! warning "Оговорка"
|
||||
Следующий список компаний, использующих ClickHouse, и их истории успеха собраны из открытых источников, поэтому они могут отличаться от текущей реальности. Мы были бы очень признательны, если бы вы поделились историей принятия ClickHouse в свою компанию и [добавьте его в список](https://github.com/ClickHouse/ClickHouse/edit/master/docs/en/introduction/adopters.md), но, пожалуйста, убедитесь, что у вас не будет никаких проблем с NDA, сделав это. Предоставление обновлений с публикациями от других компаний также полезно.
|
||||
|
||||
| Компания | Промышленность | Usecase | Размер кластера | (Un)Сжатый Размер Данных<abbr title="of single replica"><sup>\*</sup></abbr> | Ссылка |
|
||||
|---------------------------------------------------------------------------------|----------------------------------------|-----------------------------|------------------------------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| [2ГИС](https://2gis.ru) | Карты | Мониторинг | — | — | [Говорить по-русски, июль 2019](https://youtu.be/58sPkXfq6nw) |
|
||||
| [Браузер Aloha](https://alohabrowser.com/) | Мобильное приложение | Серверная часть браузера | — | — | [Слайды на русском языке, май 2019 года](https://github.com/yandex/clickhouse-presentations/blob/master/meetup22/aloha.pdf) |
|
||||
| [Компания Amadeus](https://amadeus.com/) | Путешествовать | Аналитика | — | — | [Пресс-Релиз, Апрель 2018 Года](https://www.altinity.com/blog/2018/4/5/amadeus-technologies-launches-investment-and-insights-tool-based-on-machine-learning-and-strategy-algorithms) |
|
||||
| [Компания](https://www.appsflyer.com) | Мобильная аналитика | Главный продукт | — | — | [Говорить по-русски, июль 2019](https://www.youtube.com/watch?v=M3wbRlcpBbY) |
|
||||
| [ArenaData](https://arenadata.tech/) | Платформа данных | Главный продукт | — | — | [Слайды на русском языке, декабрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup38/indexes.pdf) |
|
||||
| [На Badoo](https://badoo.com) | Знакомства | Таймсерии | — | — | [Слайды на русском языке, декабрь 2019 года](https://presentations.clickhouse.tech/meetup38/forecast.pdf) |
|
||||
| [Бенокс](https://www.benocs.com/) | Сетевая телеметрия и аналитика | Главный продукт | — | — | [Слайды на английском языке, октябрь 2017 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup9/lpm.pdf) |
|
||||
| [Блумберг](https://www.bloomberg.com/) | Финансы, СМИ | Мониторинг | 102 сервера | — | [Слайды, Май 2018 Года](https://www.slideshare.net/Altinity/http-analytics-for-6m-requests-per-second-using-clickhouse-by-alexander-bocharov) |
|
||||
| [Блокси](https://bloxy.info) | Блокчейн | Аналитика | — | — | [Слайды на русском языке, август 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/4_bloxy.pptx) |
|
||||
| `Dataliance/UltraPower` | Телекоммуникационный | Аналитика | — | — | [Слайды на китайском языке, январь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/telecom.pdf) |
|
||||
| [CARTO](https://carto.com/) | Бизнес-разведка | Гео аналитика | — | — | [Геопространственная обработка с помощью Clickhouse](https://carto.com/blog/geospatial-processing-with-clickhouse/) |
|
||||
| [CERN](http://public.web.cern.ch/public/) | Исследование | Эксперимент | — | — | [Пресс-релиз, апрель 2012 года](https://www.yandex.com/company/press_center/press_releases/2012/2012-04-10/) |
|
||||
| [Компании Cisco](http://cisco.com/) | Сетевой | Анализ трафика | — | — | [Молниеносный разговор, октябрь 2019 года](https://youtu.be/-hI1vDR2oPY?t=5057) |
|
||||
| [Ценные Бумаги Цитадели](https://www.citadelsecurities.com/) | Финансы | — | — | — | [Взнос, Март 2019 Года](https://github.com/ClickHouse/ClickHouse/pull/4774) |
|
||||
| [Ситимобил](https://city-mobil.ru) | Такси | Аналитика | — | — | [Запись в блоге на русском языке, март 2020 года](https://habr.com/en/company/citymobil/blog/490660/) |
|
||||
| [ContentSquare](https://contentsquare.com) | Веб-аналитика | Главный продукт | — | — | [Запись в блоге на французском языке, ноябрь 2018 года](http://souslecapot.net/2018/11/21/patrick-chatain-vp-engineering-chez-contentsquare-penser-davantage-amelioration-continue-que-revolution-constante/) |
|
||||
| [Cloudflare](https://cloudflare.com) | CDN | Анализ трафика | 36 серверов | — | [Сообщение в блоге, май 2017 года](https://blog.cloudflare.com/how-cloudflare-analyzes-1m-dns-queries-per-second/), [Сообщение в блоге, март 2018 года](https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/) |
|
||||
| [Корунет](https://coru.net/) | Аналитика | Главный продукт | — | — | [Слайды на английском языке, апрель 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup21/predictive_models.pdf) |
|
||||
| [CraiditX 氪信](https://creditx.com) | Финансовый ИИ | Анализ | — | — | [Слайды на английском языке, ноябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/udf.pptx) |
|
||||
| [Criteo / Storetail](https://www.criteo.com/) | Розничная торговля | Главный продукт | — | — | [Слайды на английском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/3_storetail.pptx) |
|
||||
| [Дойче банк](https://db.com) | Финансы | Би аналитика | — | — | [Слайды на английском языке, октябрь 2019 года](https://bigdatadays.ru/wp-content/uploads/2019/10/D2-H3-3_Yakunin-Goihburg.pdf) |
|
||||
| [Дива-е](https://www.diva-e.com) | Цифровой Консалтинг | Главный продукт | — | — | [Слайды на английском языке, сентябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup29/ClickHouse-MeetUp-Unusual-Applications-sd-2019-09-17.pdf) |
|
||||
| [Компания Exness](https://www.exness.com) | Торговый | Метрики, Ведение Журнала | — | — | [Разговор на русском языке, май 2019 года](https://youtu.be/_rpU-TvSfZ8?t=3215) |
|
||||
| [Джинн](https://geniee.co.jp) | Рекламная сеть | Главный продукт | — | — | [Запись в блоге на японском языке, июль 2017 года](https://tech.geniee.co.jp/entry/2017/07/20/160100) |
|
||||
| [HUYA](https://www.huya.com/) | Потоковое видео | Аналитика | — | — | [Слайды на китайском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/7.%20ClickHouse万亿数据分析实践%20李本旺(sundy-li)%20虎牙.pdf) |
|
||||
| [Идеалиста](https://www.idealista.com) | Недвижимость | Аналитика | — | — | [Сообщение в блоге на английском языке, апрель 2019 года](https://clickhouse.yandex/blog/en/clickhouse-meetup-in-madrid-on-april-2-2019) |
|
||||
| [Infovista](https://www.infovista.com/) | Сети | Аналитика | — | — | [Слайды на английском языке, октябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup30/infovista.pdf) |
|
||||
| [Компания innogames](https://www.innogames.com) | Игры | Метрики, Ведение Журнала | — | — | [Слайды на русском языке, сентябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/graphite_and_clickHouse.pdf) |
|
||||
| [Интегрос](https://integros.com) | Платформа для видеосервисов | Аналитика | — | — | [Слайды на русском языке, май 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) |
|
||||
| [Данные По Кадьяку](https://www.kodiakdata.com/) | Облака | Главный продукт | — | — | [Слайды на английском языке, апрель 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup13/kodiak_data.pdf) |
|
||||
| [Контур](https://kontur.ru) | Разработка программного обеспечения | Метрика | — | — | [Говорить по-русски, ноябрь 2018](https://www.youtube.com/watch?v=U4u4Bd0FtrY) |
|
||||
| [LifeStreet](https://lifestreet.com/) | Рекламная сеть | Главный продукт | 75 серверов (3 реплики) | 5.27 ПИБ | [Запись в блоге на русском языке, февраль 2017 года](https://habr.com/en/post/322620/) |
|
||||
| [Mail.ru Облачные Решения](https://mcs.mail.ru/) | Облачные сервисы | Главный продукт | — | — | [Запуск экземпляра ClickHouse на русском языке](https://mcs.mail.ru/help/db-create/clickhouse#) |
|
||||
| [MessageBird](https://www.messagebird.com) | Электросвязь | Статистика | — | — | [Слайды на английском языке, ноябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup20/messagebird.pdf) |
|
||||
| [MGID](https://www.mgid.com/) | Рекламная сеть | Веб-аналитика | — | — | [Наш опыт внедрения аналитической СУБД ClickHouse на русском языке](http://gs-studio.com/news-about-it/32777----clickhouse---c) |
|
||||
| [OneAPM](https://www.oneapm.com/) | Мониторинг и анализ данных | Главный продукт | — | — | [Слайды на китайском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/8.%20clickhouse在OneAPM的应用%20杜龙.pdf) |
|
||||
| [ПРАГМА Инноваций](http://www.pragma-innovation.fr/) | Телеметрия и анализ Больших Данных | Главный продукт | — | — | [Слайды на английском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/4_pragma_innovation.pdf) |
|
||||
| [QINGCLOUD](https://www.qingcloud.com/) | Облачные сервисы | Главный продукт | — | — | [Слайды на китайском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/4.%20Cloud%20%2B%20TSDB%20for%20ClickHouse%20张健%20QingCloud.pdf) |
|
||||
| [Qrator](https://qrator.net) | Защита от DDoS-атак | Главный продукт | — | — | [Сообщение В Блоге, Март 2019 Года](https://blog.qrator.net/en/clickhouse-ddos-mitigation_37/) |
|
||||
| [Beijing PERCENT Information Technology Co., Лимитед.](https://www.percent.cn/) | Аналитика | Главный продукт | — | — | [Слайды на китайском языке, июнь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/4.%20ClickHouse万亿数据双中心的设计与实践%20.pdf) |
|
||||
| [Бродяга](https://rambler.ru) | Интернет услуги | Аналитика | — | — | [Говорить по-русски, апрель 2018](https://medium.com/@ramblertop/разработка-api-clickhouse-для-рамблер-топ-100-f4c7e56f3141) |
|
||||
| [Tencent](https://www.tencent.com) | Обмен сообщениями | Регистрация | — | — | [Говорить по-китайски, ноябрь 2019](https://youtu.be/T-iVQRuw-QY?t=5050) |
|
||||
| [Движения Звезд](https://trafficstars.com/) | Рекламная сеть | — | — | — | [Слайды на русском языке, май 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup15/lightning/ninja.pdf) |
|
||||
| [S7 Airlines](https://www.s7.ru) | Авиакомпании | Метрики, Ведение Журнала | — | — | [Разговор на русском языке, март 2019 года](https://www.youtube.com/watch?v=nwG68klRpPg&t=15s) |
|
||||
| [Общий](https://www.semrush.com/) | Маркетинг | Главный продукт | — | — | [Слайды на русском языке, август 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/5_semrush.pdf) |
|
||||
| [scireum ГмбХ](https://www.scireum.de/) | электронная коммерция | Главный продукт | — | — | [Говорить по-немецки, февраль 2020](https://www.youtube.com/watch?v=7QWAn5RbyR4) |
|
||||
| [Караул](https://sentry.io/) | Разработчик | Бэкэнд для продукта | — | — | [Сообщение в блоге на английском языке, май 2019 года](https://blog.sentry.io/2019/05/16/introducing-snuba-sentrys-new-search-infrastructure) |
|
||||
| [SGK](http://www.sgk.gov.tr/wps/portal/sgk/tr) | Государственное Социальное Обеспечение | Аналитика | — | — | [Слайды на английском языке, ноябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/ClickHouse%20Meetup-Ramazan%20POLAT.pdf) |
|
||||
| [СЕО.делать](https://seo.do/) | Аналитика | Главный продукт | — | — | [Слайды на английском языке, ноябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/CH%20Presentation-%20Metehan%20Çetinkaya.pdf) |
|
||||
| [Зина](http://english.sina.com/index.html) | Новости | — | — | — | [Слайды на китайском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/6.%20ClickHouse最佳实践%20高鹏_新浪.pdf) |
|
||||
| [SMI2](https://smi2.ru/) | Новости | Аналитика | — | — | [Запись в блоге на русском языке, ноябрь 2017 года](https://habr.com/ru/company/smi2/blog/314558/) |
|
||||
| [Чмок](https://www.splunk.com/) | Бизнес-аналитика | Главный продукт | — | — | [Слайды на английском языке, январь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) |
|
||||
| [Спотифай](https://www.spotify.com) | Музыка | Экспериментирование | — | — | [Слайды, Июль 2018 Года](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) |
|
||||
| [Tencent](https://www.tencent.com) | Большие данные | Обработка данных | — | — | [Слайды на китайском языке, октябрь 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/5.%20ClickHouse大数据集群应用_李俊飞腾讯网媒事业部.pdf) |
|
||||
| [Убер](https://www.uber.com) | Такси | Регистрация | — | — | [Слайды, Февраль 2020 Года](https://presentations.clickhouse.tech/meetup40/uber.pdf) |
|
||||
| [ВКонтакте](https://vk.com) | Социальная сеть | Статистика, Ведение Журнала | — | — | [Слайды на русском языке, август 2018 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/3_vk.pdf) |
|
||||
| [Мудрецы](https://wisebits.com/) | IT-решение | Аналитика | — | — | [Слайды на русском языке, май 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) |
|
||||
| [Технология Сяосин.](https://www.xiaoheiban.cn/) | Образование | Общая цель | — | — | [Слайды на английском языке, ноябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/sync-clickhouse-with-mysql-mongodb.pptx) |
|
||||
| [Сималайя](https://www.ximalaya.com/) | Общий доступ к аудио | OLAP | — | — | [Слайды на английском языке, ноябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/ximalaya.pdf) |
|
||||
| [Облако Яндекса](https://cloud.yandex.ru/services/managed-clickhouse) | Публичное Облако | Главный продукт | — | — | [Разговор на русском языке, декабрь 2019 года](https://www.youtube.com/watch?v=pgnak9e_E0o) |
|
||||
| [DataLens Яндекс](https://cloud.yandex.ru/services/datalens) | Бизнес-разведка | Главный продукт | — | — | [Слайды на русском языке, декабрь 2019 года](https://presentations.clickhouse.tech/meetup38/datalens.pdf) |
|
||||
| [Яндекс Маркет](https://market.yandex.ru/) | электронная коммерция | Метрики, Ведение Журнала | — | — | [Разговор на русском языке, январь 2019 года](https://youtu.be/_l1qP0DyBcA?t=478) |
|
||||
| [Яндекс Метрика](https://metrica.yandex.com) | Веб-аналитика | Главный продукт | 360 серверов в одном кластере, 1862 сервера в одном отделе | 66.41 ПИБ / 5.68 ПИБ | [Слайды, Февраль 2020 Года](https://presentations.clickhouse.tech/meetup40/introduction/#13) |
|
||||
| [ЦВТ](https://htc-cs.ru/) | Разработка программного обеспечения | Метрики, Ведение Журнала | — | — | [Сообщение в блоге, март 2019 года, на русском языке](https://vc.ru/dev/62715-kak-my-stroili-monitoring-na-prometheus-clickhouse-i-elk) |
|
||||
| [МКБ](https://mkb.ru/) | Банк | Мониторинг веб-систем | — | — | [Слайды на русском языке, сентябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/mkb.pdf) |
|
||||
| [金数据](https://jinshuju.net) | Би аналитика | Главный продукт | — | — | [Слайды на китайском языке, октябрь 2019 года](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/3.%20金数据数据架构调整方案Public.pdf) |
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/en/introduction/adopters/) <!--hide-->
|
1
docs/ru/introduction/adopters.md
Symbolic link
1
docs/ru/introduction/adopters.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/introduction/adopters.md
|
@ -61,4 +61,11 @@ ClickHouse предоставляет различные способы разм
|
||||
|
||||
Подробнее смотрите раздел [Репликация данных](../engines/table_engines/mergetree_family/replication.md).
|
||||
|
||||
## Особенности, которые могут считаться недостатками {#osobennosti-clickhouse-kotorye-mogut-schitatsia-nedostatkami}
|
||||
|
||||
1. Отсутствие полноценных транзакций.
|
||||
2. Возможность изменять или удалять ранее записанные данные с низкими задержками и высокой частотой запросов не предоставляется. Есть массовое удаление и изменение данных для очистки более не нужного или соответствия [GDPR](https://gdpr-info.eu).
|
||||
3. Разреженный индекс делает ClickHouse плохо пригодным для точечных чтений одиночных строк по своим
|
||||
ключам.
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/introduction/distinctive_features/) <!--hide-->
|
||||
|
@ -1,8 +0,0 @@
|
||||
# Особенности ClickHouse, которые могут считаться недостатками {#osobennosti-clickhouse-kotorye-mogut-schitatsia-nedostatkami}
|
||||
|
||||
1. Отсутствие полноценных транзакций.
|
||||
2. Возможность изменять или удалять ранее записанные данные с низкими задержками и высокой частотой запросов не предоставляется. Есть массовое удаление и изменение данных для очистки более не нужного или соответствия [GDPR](https://gdpr-info.eu).
|
||||
3. Разреженный индекс делает ClickHouse плохо пригодным для точечных чтений одиночных строк по своим
|
||||
ключам.
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/introduction/features_considered_disadvantages/) <!--hide-->
|
@ -32,6 +32,8 @@ ClickHouse собирает:
|
||||
|
||||
Можно настроить экспорт метрик из ClickHouse в [Graphite](https://github.com/graphite-project). Смотрите секцию [graphite](server_configuration_parameters/settings.md#server_configuration_parameters-graphite) конфигурационного файла ClickHouse. Перед настройкой экспорта метрик необходимо настроить Graphite, как указано в [официальном руководстве](https://graphite.readthedocs.io/en/latest/install.html).
|
||||
|
||||
Можно настроить экспорт метрик из ClickHouse в [Prometheus](https://prometheus.io). Смотрите [prometheus](server_configuration_parameters/settings.md#server_configuration_parameters-prometheus) конфигурационного файла ClickHouse. Перед настройкой экспорта метрик необходимо настроить Prometheus, как указано в [официальном руководстве](https://prometheus.io/docs/prometheus/latest/installation/).
|
||||
|
||||
Также, можно отслеживать доступность сервера через HTTP API. Отправьте `HTTP GET` к ресурсу `/ping`. Если сервер доступен, он отвечает `200 OK`.
|
||||
|
||||
Для мониторинга серверов в кластерной конфигурации необходимо установить параметр [max\_replica\_delay\_for\_distributed\_queries](settings/settings.md#settings-max_replica_delay_for_distributed_queries) и использовать HTTP ресурс `/replicas_status`. Если реплика доступна и не отстаёт от других реплик, то запрос к `/replicas_status` возвращает `200 OK`. Если реплика отстаёт, то запрос возвращает `503 HTTP_SERVICE_UNAVAILABLE`, включая информацию о размере отставания.
|
||||
|
@ -1,62 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Выборки Профилировщик Запросов {#sampling-query-profiler}
|
||||
|
||||
ClickHouse запускает профилировщик выборок, который позволяет анализировать выполнение запросов. С помощью profiler можно найти подпрограммы исходного кода, которые наиболее часто используются во время выполнения запроса. Вы можете отслеживать процессорное время и время работы настенных часов, включая время простоя.
|
||||
|
||||
Чтобы использовать профилировщик:
|
||||
|
||||
- Настройка программы [журнал трассировки](../server_configuration_parameters/settings.md#server_configuration_parameters-trace_log) раздел конфигурации сервера.
|
||||
|
||||
В этом разделе настраиваются следующие параметры: [журнал трассировки](../../operations/optimizing_performance/sampling_query_profiler.md#system_tables-trace_log) системная таблица, содержащая результаты работы профилировщика. Он настроен по умолчанию. Помните, что данные в этой таблице действительны только для работающего сервера. После перезагрузки сервера ClickHouse не очищает таблицу, и все сохраненные адреса виртуальной памяти могут стать недействительными.
|
||||
|
||||
- Настройка программы [query\_profiler\_cpu\_time\_period\_ns](../settings/settings.md#query_profiler_cpu_time_period_ns) или [query\_profiler\_real\_time\_period\_ns](../settings/settings.md#query_profiler_real_time_period_ns) настройки. Обе настройки можно использовать одновременно.
|
||||
|
||||
Эти параметры позволяют настроить таймеры профилировщика. Поскольку это параметры сеанса, вы можете получить различную частоту дискретизации для всего сервера, отдельных пользователей или профилей пользователей, для вашего интерактивного сеанса и для каждого отдельного запроса.
|
||||
|
||||
Частота дискретизации по умолчанию составляет одну выборку в секунду, и включены как ЦП, так и реальные таймеры. Эта частота позволяет собрать достаточно информации о кластере ClickHouse. В то же время, работая с такой частотой, профилировщик не влияет на производительность сервера ClickHouse. Если вам нужно профилировать каждый отдельный запрос, попробуйте использовать более высокую частоту дискретизации.
|
||||
|
||||
Для того чтобы проанализировать `trace_log` системная таблица:
|
||||
|
||||
- Установите устройство `clickhouse-common-static-dbg` пакет. Видеть [Установка из пакетов DEB](../../getting_started/install.md#install-from-deb-packages).
|
||||
|
||||
- Разрешить функции самоанализа с помощью [allow\_introspection\_functions](../settings/settings.md#settings-allow_introspection_functions) установка.
|
||||
|
||||
По соображениям безопасности функции самоанализа по умолчанию отключены.
|
||||
|
||||
- Используйте `addressToLine`, `addressToSymbol` и `demangle` [функции самоанализа](../../operations/optimizing_performance/sampling_query_profiler.md) чтобы получить имена функций и их позиции в коде ClickHouse. Чтобы получить профиль для какого-либо запроса, вам необходимо агрегировать данные из `trace_log` стол. Вы можете агрегировать данные по отдельным функциям или по всем трассировкам стека.
|
||||
|
||||
Если вам нужно визуализировать `trace_log` информация, попробуйте [огнемет](../../interfaces/third-party/gui/#clickhouse-flamegraph) и [speedscope](https://github.com/laplab/clickhouse-speedscope).
|
||||
|
||||
## Пример {#example}
|
||||
|
||||
В этом примере мы:
|
||||
|
||||
- Фильтрация `trace_log` данные по идентификатору запроса и текущей дате.
|
||||
|
||||
- Агрегирование по трассировке стека.
|
||||
|
||||
- Используя функции интроспекции, мы получим отчет о:
|
||||
|
||||
- Имена символов и соответствующие им функции исходного кода.
|
||||
- Расположение исходных кодов этих функций.
|
||||
|
||||
<!-- -->
|
||||
|
||||
``` sql
|
||||
SELECT
|
||||
count(),
|
||||
arrayStringConcat(arrayMap(x -> concat(demangle(addressToSymbol(x)), '\n ', addressToLine(x)), trace), '\n') AS sym
|
||||
FROM system.trace_log
|
||||
WHERE (query_id = 'ebca3574-ad0a-400a-9cbc-dca382f5998c') AND (event_date = today())
|
||||
GROUP BY trace
|
||||
ORDER BY count() DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
``` text
|
||||
{% include "operations/performance/sampling_query_profiler_example_result.txt" %}
|
||||
```
|
@ -0,0 +1 @@
|
||||
../../../en/operations/optimizing_performance/sampling_query_profiler.md
|
@ -1,80 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Как Протестировать Ваше Оборудование С Помощью ClickHouse {#how-to-test-your-hardware-with-clickhouse}
|
||||
|
||||
С помощью этой инструкции вы можете запустить базовый тест производительности ClickHouse на любом сервере без установки пакетов ClickHouse.
|
||||
|
||||
1. Идти к «commits» страница: https://github.com/ClickHouse/ClickHouse/commits/master
|
||||
|
||||
2. Нажмите на первую зеленую галочку или красный крест с зеленым цветом «ClickHouse Build Check» и нажмите на кнопку «Details» ссылка рядом «ClickHouse Build Check».
|
||||
|
||||
3. Скопируйте ссылку на «clickhouse» двоичный код для amd64 или aarch64.
|
||||
|
||||
4. ssh к серверу и скачать его с помощью wget:
|
||||
|
||||
<!-- -->
|
||||
|
||||
# For amd64:
|
||||
wget https://clickhouse-builds.s3.yandex.net/0/00ba767f5d2a929394ea3be193b1f79074a1c4bc/1578163263_binary/clickhouse
|
||||
# For aarch64:
|
||||
wget https://clickhouse-builds.s3.yandex.net/0/00ba767f5d2a929394ea3be193b1f79074a1c4bc/1578161264_binary/clickhouse
|
||||
# Then do:
|
||||
chmod a+x clickhouse
|
||||
|
||||
1. Скачать конфиги:
|
||||
|
||||
<!-- -->
|
||||
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/programs/server/config.xml
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/programs/server/users.xml
|
||||
mkdir config.d
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/programs/server/config.d/path.xml -O config.d/path.xml
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/programs/server/config.d/log_to_console.xml -O config.d/log_to_console.xml
|
||||
|
||||
1. Скачать тест файлы:
|
||||
|
||||
<!-- -->
|
||||
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/benchmark/clickhouse/benchmark-new.sh
|
||||
chmod a+x benchmark-new.sh
|
||||
wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/benchmark/clickhouse/queries.sql
|
||||
|
||||
1. Загрузите тестовые данные в соответствии с [Яндекс.Набор метрика](../getting_started/example_datasets/metrica.md) инструкция («hits» таблица, содержащая 100 миллионов строк).
|
||||
|
||||
<!-- -->
|
||||
|
||||
wget https://clickhouse-datasets.s3.yandex.net/hits/partitions/hits_100m_obfuscated_v1.tar.xz
|
||||
tar xvf hits_100m_obfuscated_v1.tar.xz -C .
|
||||
mv hits_100m_obfuscated_v1/* .
|
||||
|
||||
1. Запустите сервер:
|
||||
|
||||
<!-- -->
|
||||
|
||||
./clickhouse server
|
||||
|
||||
1. Проверьте данные: ssh на сервер в другом терминале
|
||||
|
||||
<!-- -->
|
||||
|
||||
./clickhouse client --query "SELECT count() FROM hits_100m_obfuscated"
|
||||
100000000
|
||||
|
||||
1. Отредактируйте текст benchmark-new.sh, изменение «clickhouse-client» к «./clickhouse client» и добавить «–max\_memory\_usage 100000000000» параметр.
|
||||
|
||||
<!-- -->
|
||||
|
||||
mcedit benchmark-new.sh
|
||||
|
||||
1. Выполнить тест:
|
||||
|
||||
<!-- -->
|
||||
|
||||
./benchmark-new.sh hits_100m_obfuscated
|
||||
|
||||
1. Отправьте номера и информацию о конфигурации вашего оборудования по адресу clickhouse-feedback@yandex-team.com
|
||||
|
||||
Все результаты опубликованы здесь: https://clickhouse-да.технология / benchmark\_hardware.HTML
|
1
docs/ru/operations/performance_test.md
Symbolic link
1
docs/ru/operations/performance_test.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/operations/performance_test.md
|
@ -524,6 +524,30 @@ ClickHouse проверит условия `min_part_size` и `min_part_size_rat
|
||||
<path>/var/lib/clickhouse/</path>
|
||||
```
|
||||
|
||||
## prometheus {#server_configuration_parameters-prometheus}
|
||||
|
||||
Опубликовать данные о метриках, для сбора с помощью системы мониторинга [Prometheus](https://prometheus.io).
|
||||
|
||||
Настройки:
|
||||
|
||||
- `endpoint` – путь по которому будет осуществляться экспорт данных метрик по HTTP протоколу для сбора с помощью prometheus. Должен начинаться с '/'.
|
||||
- `port` – порт по которому будет доступен endpoint для сбора метрик.
|
||||
- `metrics` – флаг для экспорта текущих значений метрик из таблицы [system.metrics](../system_tables.md#system_tables-metrics).
|
||||
- `events` – флаг для экспорта текущих значений метрик из таблицы [system.events](../system_tables.md#system_tables-events).
|
||||
- `asynchronous_metrics` – флаг для экспорта текущих значений значения метрик из таблицы [system.asynchronous\_metrics](../system_tables.md#system_tables-asynchronous_metrics).
|
||||
|
||||
**Пример**
|
||||
|
||||
``` xml
|
||||
<prometheus>
|
||||
<endpoint>/metrics</endpoint>
|
||||
<port>8001</port>
|
||||
<metrics>true</metrics>
|
||||
<events>true</events>
|
||||
<asynchronous_metrics>true</asynchronous_metrics>
|
||||
</prometheus>
|
||||
```
|
||||
|
||||
## query\_log {#server_configuration_parameters-query-log}
|
||||
|
||||
Настройка логирования запросов, принятых с настройкой [log\_queries=1](../settings/settings.md).
|
||||
|
@ -213,6 +213,49 @@ INSERT INTO datetime_t SELECT now()
|
||||
Ok.
|
||||
```
|
||||
|
||||
## input\_format\_values\_deduce\_templates\_of\_expressions {#settings-input_format_values_deduce_templates_of_expressions}
|
||||
|
||||
Включает или отключает попытку вычисления шаблона для выражений SQL в формате [Values](../../interfaces/formats.md#data-format-values). Это позволяет гораздо быстрее парсить и интерпретировать выражения в `Values`, если выражения в последовательных строках имеют одинаковую структуру. ClickHouse пытается вычислить шаблон выражения, распарсить следующие строки с помощью этого шаблона и вычислить выражение в пачке успешно проанализированных строк.
|
||||
|
||||
Возможные значения:
|
||||
|
||||
- 0 — Выключена.
|
||||
- 1 — Включена.
|
||||
|
||||
Значение по умолчанию: 1.
|
||||
|
||||
Для следующего запроса:
|
||||
|
||||
``` sql
|
||||
INSERT INTO test VALUES (lower('Hello')), (lower('world')), (lower('INSERT')), (upper('Values')), ...
|
||||
```
|
||||
|
||||
- Если `input_format_values_interpret_expressions=1` и `format_values_deduce_templates_of_expressions=0`, выражения интерпретируются отдельно для каждой строки (это очень медленно для большого количества строк).
|
||||
- Если `input_format_values_interpret_expressions=0` и `format_values_deduce_templates_of_expressions=1`, выражения в первой, второй и третьей строках парсятся с помощью шаблона `lower(String)` и интерпретируется вместе, выражение в четвертой строке парсится с другим шаблоном (`upper(String)`).
|
||||
- Если `input_format_values_interpret_expressions=1` и `format_values_deduce_templates_of_expressions=1`, то же самое, что и в предыдущем случае, но также позволяет выполнять резервную интерпретацию выражений отдельно, если невозможно вычислить шаблон.
|
||||
|
||||
## input\_format\_values\_accurate\_types\_of\_literals {#settings-input-format-values-accurate-types-of-literals}
|
||||
|
||||
Эта настройка используется, только когда `input_format_values_deduce_templates_of_expressions = 1`. Выражения для некоторых столбцов могут иметь одинаковую структуру, но содержат числовые литералы разных типов, например:
|
||||
|
||||
``` sql
|
||||
(..., abs(0), ...), -- UInt64 literal
|
||||
(..., abs(3.141592654), ...), -- Float64 literal
|
||||
(..., abs(-1), ...), -- Int64 literal
|
||||
```
|
||||
|
||||
Возможные значения:
|
||||
|
||||
- 0 — Выключена.
|
||||
|
||||
В этом случае, ClickHouse может использовать более общий тип для некоторых литералов (например, `Float64` или `Int64` вместо `UInt64` для `42`), но это может привести к переполнению и проблемам с точностью.
|
||||
|
||||
- 1 — Включена.
|
||||
|
||||
В этом случае, ClickHouse проверяет фактический тип литерала и использует шаблон выражения соответствующего типа. В некоторых случаях это может значительно замедлить оценку выажения в `Values`.
|
||||
|
||||
Значение по умолчанию: 1.
|
||||
|
||||
## input\_format\_defaults\_for\_omitted\_fields {#session_settings-input_format_defaults_for_omitted_fields}
|
||||
|
||||
При вставке данных запросом `INSERT`, заменяет пропущенные поля значениям по умолчанию для типа данных столбца.
|
||||
|
@ -1,154 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# clickhouse-бенчмарк {#clickhouse-benchmark}
|
||||
|
||||
Подключается к серверу ClickHouse и повторно отправляет указанные запросы.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
``` bash
|
||||
$ echo "single query" | clickhouse-benchmark [keys]
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
``` bash
|
||||
$ clickhouse-benchmark [keys] <<< "single query"
|
||||
```
|
||||
|
||||
Если вы хотите отправить набор запросов, создайте текстовый файл и поместите каждый запрос в отдельную строку в этом файле. Например:
|
||||
|
||||
``` sql
|
||||
SELECT * FROM system.numbers LIMIT 10000000
|
||||
SELECT 1
|
||||
```
|
||||
|
||||
Затем передайте этот файл на стандартный вход `clickhouse-benchmark`.
|
||||
|
||||
``` bash
|
||||
clickhouse-benchmark [keys] < queries_file
|
||||
```
|
||||
|
||||
## Ключи {#clickhouse-benchmark-keys}
|
||||
|
||||
- `-c N`, `--concurrency=N` — Number of queries that `clickhouse-benchmark` посылает одновременно. Значение по умолчанию: 1.
|
||||
- `-d N`, `--delay=N` — Interval in seconds between intermediate reports (set 0 to disable reports). Default value: 1.
|
||||
- `-h WORD`, `--host=WORD` — Server host. Default value: `localhost`. Для [режим сравнения](#clickhouse-benchmark-comparison-mode) вы можете использовать несколько `-h` ключи.
|
||||
- `-p N`, `--port=N` — Server port. Default value: 9000. For the [режим сравнения](#clickhouse-benchmark-comparison-mode) вы можете использовать несколько `-p` ключи.
|
||||
- `-i N`, `--iterations=N` — Total number of queries. Default value: 0.
|
||||
- `-r`, `--randomize` — Random order of queries execution if there is more then one input query.
|
||||
- `-s`, `--secure` — Using TLS connection.
|
||||
- `-t N`, `--timelimit=N` — Time limit in seconds. `clickhouse-benchmark` прекращает отправку запросов по достижении указанного срока. Значение по умолчанию: 0 (ограничение по времени отключено).
|
||||
- `--confidence=N` — Level of confidence for T-test. Possible values: 0 (80%), 1 (90%), 2 (95%), 3 (98%), 4 (99%), 5 (99.5%). Default value: 5. In the [режим сравнения](#clickhouse-benchmark-comparison-mode) `clickhouse-benchmark` выполняет следующие функции: [Независимый двухпробный t-тест Стьюдента](https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test) проверьте, не отличаются ли эти два распределения с выбранным уровнем достоверности.
|
||||
- `--cumulative` — Printing cumulative data instead of data per interval.
|
||||
- `--database=DATABASE_NAME` — ClickHouse database name. Default value: `default`.
|
||||
- `--json=FILEPATH` — JSON output. When the key is set, `clickhouse-benchmark` выводит отчет в указанный JSON-файл.
|
||||
- `--user=USERNAME` — ClickHouse user name. Default value: `default`.
|
||||
- `--password=PSWD` — ClickHouse user password. Default value: empty string.
|
||||
- `--stacktrace` — Stack traces output. When the key is set, `clickhouse-bencmark` выводит трассировки стека исключений.
|
||||
- `--stage=WORD` — Query processing stage at server. ClickHouse stops query processing and returns answer to `clickhouse-benchmark` на указанном этапе. Возможное значение: `complete`, `fetch_columns`, `with_mergeable_state`. Значение по умолчанию: `complete`.
|
||||
- `--help` — Shows the help message.
|
||||
|
||||
Если вы хотите применить некоторые из них [настройки](../../operations/settings/index.md) для запросов передайте их в качестве ключа `--<session setting name>= SETTING_VALUE`. Например, `--max_memory_usage=1048576`.
|
||||
|
||||
## Выход {#clickhouse-benchmark-output}
|
||||
|
||||
По умолчанию, `clickhouse-benchmark` отчеты для каждого из них `--delay` интервал.
|
||||
|
||||
Пример отчета:
|
||||
|
||||
``` text
|
||||
Queries executed: 10.
|
||||
|
||||
localhost:9000, queries 10, QPS: 6.772, RPS: 67904487.440, MiB/s: 518.070, result RPS: 67721584.984, result MiB/s: 516.675.
|
||||
|
||||
0.000% 0.145 sec.
|
||||
10.000% 0.146 sec.
|
||||
20.000% 0.146 sec.
|
||||
30.000% 0.146 sec.
|
||||
40.000% 0.147 sec.
|
||||
50.000% 0.148 sec.
|
||||
60.000% 0.148 sec.
|
||||
70.000% 0.148 sec.
|
||||
80.000% 0.149 sec.
|
||||
90.000% 0.150 sec.
|
||||
95.000% 0.150 sec.
|
||||
99.000% 0.150 sec.
|
||||
99.900% 0.150 sec.
|
||||
99.990% 0.150 sec.
|
||||
```
|
||||
|
||||
В отчете вы можете найти::
|
||||
|
||||
- Количество запросов в системе `Queries executed:` поле.
|
||||
|
||||
- Строка состояния, содержащая (по порядку):
|
||||
|
||||
- Конечная точка сервера ClickHouse.
|
||||
- Количество обработанных запросов.
|
||||
- QPS: QPS: сколько запросов сервер выполняет в секунду в течение периода, указанного в `--delay` аргумент.
|
||||
- RPS: сколько строк сервер читает в секунду в течение периода, указанного в `--delay` аргумент.
|
||||
- MiB/s: сколько мегабайт сервер читает в секунду в течение периода, указанного в `--delay` аргумент.
|
||||
- result RPS: сколько строк помещается сервером в результат запроса в секунду в течение периода, указанного в `--delay` аргумент.
|
||||
- результат MiB/s. сколько мебибайт помещается сервером в результат запроса в секунду в течение периода, указанного в `--delay` аргумент.
|
||||
|
||||
- Процентили времени выполнения запросов.
|
||||
|
||||
## Режим сравнения {#clickhouse-benchmark-comparison-mode}
|
||||
|
||||
`clickhouse-benchmark` можно сравнить производительность для двух запущенных серверов ClickHouse.
|
||||
|
||||
Чтобы использовать режим сравнения, укажите конечные точки обоих серверов по двум парам `--host`, `--port` ключи. Ключи, сопоставленные вместе по позиции в списке аргументов, первые `--host` сопоставляется с первым `--port` и так далее. `clickhouse-benchmark` устанавливает соединения с обоими серверами, а затем отправляет запросы. Каждый запрос адресован случайно выбранному серверу. Результаты отображаются для каждого сервера отдельно.
|
||||
|
||||
## Пример {#clickhouse-benchmark-example}
|
||||
|
||||
``` bash
|
||||
$ echo "SELECT * FROM system.numbers LIMIT 10000000 OFFSET 10000000" | clickhouse-benchmark -i 10
|
||||
```
|
||||
|
||||
``` text
|
||||
Loaded 1 queries.
|
||||
|
||||
Queries executed: 6.
|
||||
|
||||
localhost:9000, queries 6, QPS: 6.153, RPS: 123398340.957, MiB/s: 941.455, result RPS: 61532982.200, result MiB/s: 469.459.
|
||||
|
||||
0.000% 0.159 sec.
|
||||
10.000% 0.159 sec.
|
||||
20.000% 0.159 sec.
|
||||
30.000% 0.160 sec.
|
||||
40.000% 0.160 sec.
|
||||
50.000% 0.162 sec.
|
||||
60.000% 0.164 sec.
|
||||
70.000% 0.165 sec.
|
||||
80.000% 0.166 sec.
|
||||
90.000% 0.166 sec.
|
||||
95.000% 0.167 sec.
|
||||
99.000% 0.167 sec.
|
||||
99.900% 0.167 sec.
|
||||
99.990% 0.167 sec.
|
||||
|
||||
|
||||
|
||||
Queries executed: 10.
|
||||
|
||||
localhost:9000, queries 10, QPS: 6.082, RPS: 121959604.568, MiB/s: 930.478, result RPS: 60815551.642, result MiB/s: 463.986.
|
||||
|
||||
0.000% 0.159 sec.
|
||||
10.000% 0.159 sec.
|
||||
20.000% 0.160 sec.
|
||||
30.000% 0.163 sec.
|
||||
40.000% 0.164 sec.
|
||||
50.000% 0.165 sec.
|
||||
60.000% 0.166 sec.
|
||||
70.000% 0.166 sec.
|
||||
80.000% 0.167 sec.
|
||||
90.000% 0.167 sec.
|
||||
95.000% 0.170 sec.
|
||||
99.000% 0.172 sec.
|
||||
99.900% 0.172 sec.
|
||||
99.990% 0.172 sec.
|
||||
```
|
1
docs/ru/operations/utilities/clickhouse-benchmark.md
Symbolic link
1
docs/ru/operations/utilities/clickhouse-benchmark.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../../en/operations/utilities/clickhouse-benchmark.md
|
@ -723,10 +723,13 @@ uniqExact(x[, ...])
|
||||
|
||||
В некоторых случаях, вы всё же можете рассчитывать на порядок выполнения запроса. Это — случаи, когда `SELECT` идёт из подзапроса, в котором используется `ORDER BY`.
|
||||
|
||||
## groupArrayInsertAt(x) {#grouparrayinsertatx}
|
||||
## groupArrayInsertAt(value, position) {#grouparrayinsertatvalue-position}
|
||||
|
||||
Вставляет в массив значение в заданную позицию.
|
||||
|
||||
!!! note "Примечание"
|
||||
Эта функция использует нумерацию массивов с нуля, в отличие от принятой в SQL нумерации с единицы.
|
||||
|
||||
Принимает на вход значение и позицию. Если на одну и ту же позицию вставляется несколько значений, в результирующем массиве может оказаться любое (первое в случае однопоточного выполнения). Если в позицию не вставляется ни одного значения, то позиции присваивается значение по умолчанию.
|
||||
|
||||
Опциональные параметры:
|
||||
|
@ -931,4 +931,42 @@ SELECT arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])
|
||||
└────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## arrayZip {#arrayzip}
|
||||
|
||||
Объединяет несколько массивов в один. Результирующий массив содержит соответственные элементы исходных массивов, сгруппированные в кортежи в указанном порядке аргументов.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
arrayZip(arr1, arr2, ..., arrN)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `arrN` — [Массив](../data_types/array.md).
|
||||
|
||||
Функция принимает любое количество массивов, которые могут быть различных типов. Все массивы должны иметь одинаковую длину.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Массив с элементами исходных массивов, сгруппированными в [кортежи](../data_types/tuple.md). Типы данных в кортежах соответствуют типам данных входных массивов и следуют в том же порядке, в котором переданы массивы.
|
||||
|
||||
Тип: [Массив](../data_types/array.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT arrayZip(['a', 'b', 'c'], [5, 2, 1])
|
||||
```
|
||||
|
||||
Ответ:
|
||||
|
||||
``` text
|
||||
┌─arrayZip(['a', 'b', 'c'], [5, 2, 1])─┐
|
||||
│ [('a',5),('b',2),('c',1)] │
|
||||
└──────────────────────────────────────┘
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/functions/array_functions/) <!--hide-->
|
||||
|
@ -1,266 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
### ClickHouse релиз 1.1.54327, 2017-12-21 {#clickhouse-release-1-1-54327-2017-12-21}
|
||||
|
||||
Этот выпуск содержит исправления ошибок для предыдущей версии 1.1.54318:
|
||||
|
||||
- Исправлена ошибка с возможным состоянием гонки в репликации, которая могла привести к потере данных. Эта проблема затрагивает версии 1.1.54310 и 1.1.54318. Если вы используете одну из этих версий с Реплицированными таблицами, настоятельно рекомендуется обновить ее. Эта проблема отображается в журналах в предупреждающих сообщениях, таких как `Part ... from own log doesn't exist.` Эта проблема актуальна, даже если вы не видите эти сообщения в журналах.
|
||||
|
||||
### ClickHouse релиз 1.1.54318, 2017-11-30 {#clickhouse-release-1-1-54318-2017-11-30}
|
||||
|
||||
Этот выпуск содержит исправления ошибок для предыдущей версии 1.1.54310:
|
||||
|
||||
- Исправлено некорректное удаление строк при слияниях в движке SummingMergeTree
|
||||
- Исправлена утечка памяти в несложных движках MergeTree
|
||||
- Исправлено снижение производительности при частых вставках в двигатели MergeTree
|
||||
- Исправлена ошибка, из-за которой очередь репликации останавливалась
|
||||
- Исправлена ротация и архивация журналов сервера
|
||||
|
||||
### ClickHouse релиз 1.1.54310, 2017-11-01 {#clickhouse-release-1-1-54310-2017-11-01}
|
||||
|
||||
#### Новые средства: {#new-features}
|
||||
|
||||
- Пользовательский ключ секционирования для семейства движков таблиц MergeTree.
|
||||
- [Кафка](https://clickhouse.yandex/docs/en/operations/table_engines/kafka/) настольный двигатель.
|
||||
- Добавлена поддержка загрузки [CatBoost](https://catboost.yandex/) модели и их применение к данным, хранящимся в ClickHouse.
|
||||
- Добавлена поддержка часовых поясов с нецелочисленными смещениями от UTC.
|
||||
- Добавлена поддержка арифметических операций с временными интервалами.
|
||||
- Диапазон значений для типов Date и DateTime расширен до 2105 года.
|
||||
- Добавил тот `CREATE MATERIALIZED VIEW x TO y` запрос (указывает существующую таблицу для хранения данных материализованного представления).
|
||||
- Добавил тот `ATTACH TABLE` запрос без аргументов.
|
||||
- Логика обработки вложенных столбцов с именами, оканчивающимися на-Map в таблице SummingMergeTree, была извлечена в агрегатную функцию sumMap. Теперь вы можете указать такие столбцы явно.
|
||||
- Максимальный размер словаря IP trie увеличен до 128 миллионов записей.
|
||||
- Добавлена функция getSizeOfEnumType.
|
||||
- Добавлена агрегатная функция sumWithOverflow.
|
||||
- Добавлена поддержка формата ввода Cap'n Proto.
|
||||
- Теперь вы можете настроить уровень сжатия при использовании алгоритма zstd.
|
||||
|
||||
#### Назад несовместимые изменения: {#backward-incompatible-changes}
|
||||
|
||||
- Создание временных таблиц с движком, отличным от памяти, не допускается.
|
||||
- Явное создание таблиц с помощью движка View или MaterializedView не допускается.
|
||||
- Во время создания таблицы новая проверка проверяет, что выражение ключа выборки включено в первичный ключ.
|
||||
|
||||
#### Устранение ошибок: {#bug-fixes}
|
||||
|
||||
- Исправлены зависания при синхронной вставке в распределенную таблицу.
|
||||
- Исправлено неатомное добавление и удаление деталей в реплицируемых таблицах.
|
||||
- Данные, вставленные в материализованное представление, не подвергаются ненужной дедупликации.
|
||||
- Выполнение запроса к распределенной таблице, для которой локальная реплика отстает, а удаленные реплики недоступны, больше не приводит к ошибке.
|
||||
- Пользователям не нужны разрешения на доступ к `default` база данных для создания временных таблиц больше не существует.
|
||||
- Исправлен сбой при указании типа массива без аргументов.
|
||||
- Исправлены зависания, когда дисковый том, содержащий журналы сервера, заполнен.
|
||||
- Исправлено переполнение в функции toRelativeWeekNum для первой недели эпохи Unix.
|
||||
|
||||
#### Улучшения сборки: {#build-improvements}
|
||||
|
||||
- Несколько сторонних библиотек (особенно Poco) были обновлены и преобразованы в подмодули git.
|
||||
|
||||
### ClickHouse релиз 1.1.54304, 2017-10-19 {#clickhouse-release-1-1-54304-2017-10-19}
|
||||
|
||||
#### Новые средства: {#new-features-1}
|
||||
|
||||
- Поддержка TLS в собственном протоколе (чтобы включить, установите `tcp_ssl_port` в `config.xml` ).
|
||||
|
||||
#### Устранение ошибок: {#bug-fixes-1}
|
||||
|
||||
- `ALTER` для реплицированных таблиц теперь пытается начать работать как можно скорее.
|
||||
- Исправлен сбой при чтении данных с настройкой `preferred_block_size_bytes=0.`
|
||||
- Исправлены сбои в работе `clickhouse-client` при нажатии на кнопку `Page Down`
|
||||
- Правильная интерпретация некоторых сложных запросов с помощью `GLOBAL IN` и `UNION ALL`
|
||||
- `FREEZE PARTITION` теперь он всегда работает атомарно.
|
||||
- Пустые почтовые запросы теперь возвращают ответ с кодом 411.
|
||||
- Исправлены ошибки интерпретации таких выражений, как `CAST(1 AS Nullable(UInt8)).`
|
||||
- Исправлена ошибка при чтении `Array(Nullable(String))` колонки от `MergeTree` таблицы.
|
||||
- Исправлен сбой при разборе таких запросов, как `SELECT dummy AS dummy, dummy AS b`
|
||||
- Пользователи обновляются правильно с недопустимым `users.xml`
|
||||
- Правильная обработка, когда исполняемый словарь возвращает ненулевой код ответа.
|
||||
|
||||
### ClickHouse релиз 1.1.54292, 2017-09-20 {#clickhouse-release-1-1-54292-2017-09-20}
|
||||
|
||||
#### Новые средства: {#new-features-2}
|
||||
|
||||
- Добавил тот `pointInPolygon` функция для работы с координатами на координатной плоскости.
|
||||
- Добавил тот `sumMap` агрегатная функция для вычисления суммы массивов, аналогичная `SummingMergeTree`.
|
||||
- Добавил тот `trunc` функция. Улучшена производительность функций округления (`round`, `floor`, `ceil`, `roundToExp2`) и скорректировал логику их работы. Поменялась логика игры `roundToExp2` функция для дробей и отрицательных чисел.
|
||||
- Исполняемый файл ClickHouse теперь меньше зависит от версии libc. Один и тот же исполняемый файл ClickHouse может работать на самых разных системах Linux. Существует еще зависимость при использовании скомпилированных запросов (с настройкой `compile = 1` , который не используется по умолчанию).
|
||||
- Сократилось время, необходимое для динамической компиляции запросов.
|
||||
|
||||
#### Устранение ошибок: {#bug-fixes-2}
|
||||
|
||||
- Исправлена ошибка, которая иногда производилась `part ... intersects previous part` сообщения и ослабленная согласованность реплик.
|
||||
- Исправлена ошибка, из-за которой сервер блокировался, если ZooKeeper был недоступен во время завершения работы.
|
||||
- Удалено избыточное ведение журнала при восстановлении реплик.
|
||||
- Исправлена ошибка в объединении всех реализаций.
|
||||
- Исправлена ошибка в функции concat, возникшая, если первый столбец в блоке имеет тип массива.
|
||||
- Прогресс теперь отображается в системе правильно.таблица слияний.
|
||||
|
||||
### ClickHouse релиз 1.1.54289, 2017-09-13 {#clickhouse-release-1-1-54289-2017-09-13}
|
||||
|
||||
#### Новые средства: {#new-features-3}
|
||||
|
||||
- `SYSTEM` запросы для администрирования сервера: `SYSTEM RELOAD DICTIONARY`, `SYSTEM RELOAD DICTIONARIES`, `SYSTEM DROP DNS CACHE`, `SYSTEM SHUTDOWN`, `SYSTEM KILL`.
|
||||
- Добавлены функции для работы с массивами: `concat`, `arraySlice`, `arrayPushBack`, `arrayPushFront`, `arrayPopBack`, `arrayPopFront`.
|
||||
- Добавлен `root` и `identity` параметры для конфигурации ZooKeeper. Это позволяет изолировать отдельных пользователей в одном кластере ZooKeeper.
|
||||
- Добавлены статистические функции `groupBitAnd`, `groupBitOr`, и `groupBitXor` (для совместимости они также доступны под названиями `BIT_AND`, `BIT_OR`, и `BIT_XOR`).
|
||||
- Внешние словари можно загрузить из MySQL, указав сокет в файловой системе.
|
||||
- Внешние словари могут быть загружены из MySQL по протоколу SSL (`ssl_cert`, `ssl_key`, `ssl_ca` параметры).
|
||||
- Добавил тот `max_network_bandwidth_for_user` настройка для ограничения общего использования полосы пропускания для запросов на одного пользователя.
|
||||
- Поддержка `DROP TABLE` для временных таблиц.
|
||||
- Поддержка чтения `DateTime` значения в формате временных меток Unix от `CSV` и `JSONEachRow` форматы.
|
||||
- Запаздывающие реплики в распределенных запросах теперь исключаются по умолчанию (пороговое значение по умолчанию-5 минут).
|
||||
- Блокировка FIFO используется во время ALTER: запрос ALTER не блокируется бесконечно для непрерывно выполняемых запросов.
|
||||
- Возможность установки `umask` в конфигурационном файле.
|
||||
- Улучшенная производительность для запросов с помощью `DISTINCT` .
|
||||
|
||||
#### Устранение ошибок: {#bug-fixes-3}
|
||||
|
||||
- Улучшен процесс удаления старых узлов в ZooKeeper. Раньше старые узлы иногда не удалялись, если были очень частые вставки, что приводило к медленному завершению работы сервера, среди прочего.
|
||||
- Исправлена рандомизация при выборе хостов для подключения к ZooKeeper.
|
||||
- Исправлено исключение запаздывающих реплик в распределенных запросах, если реплика является localhost.
|
||||
- Исправлена ошибка, когда часть данных в a `ReplicatedMergeTree` стол может быть сломан после запуска `ALTER MODIFY` на элементе в `Nested` структура.
|
||||
- Исправлена ошибка, которая могла привести к тому, что запросы SELECT «hang».
|
||||
- Улучшения в распределенных DDL-запросах.
|
||||
- Исправлен запрос `CREATE TABLE ... AS <materialized view>`.
|
||||
- Разрешен тупик в работе `ALTER ... CLEAR COLUMN IN PARTITION` запрос для `Buffer` таблицы.
|
||||
- Исправлено недопустимое значение по умолчанию для `Enum` s (0 вместо минимума) при использовании `JSONEachRow` и `TSKV` форматы.
|
||||
- Разрешен внешний вид зомби-процессов при использовании словаря с помощью `executable` источник.
|
||||
- Исправлена обработка выхода онлайн / оффлайн для запроса.
|
||||
|
||||
#### Улучшен рабочий процесс разработки и сборки ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse}
|
||||
|
||||
- Вы можете использовать `pbuilder` чтобы построить ClickHouse.
|
||||
- Вы можете использовать `libc++` вместо `libstdc++` для сборок на Linux.
|
||||
- Добавлены инструкции по использованию инструментов статического анализа кода: `Coverage`, `clang-tidy`, `cppcheck`.
|
||||
|
||||
#### Пожалуйста, обратите внимание при обновлении: {#please-note-when-upgrading}
|
||||
|
||||
- Теперь существует более высокое значение по умолчанию для параметра MergeTree `max_bytes_to_merge_at_max_space_in_pool` (максимальный общий размер частей данных для слияния, в байтах): он увеличился со 100 гигабайт до 150 гигабайт. Это может привести к большим слияниям, выполняемым после обновления сервера, что может привести к увеличению нагрузки на дисковую подсистему. Если свободное пространство, доступное на сервере, меньше чем в два раза общего объема выполняемых слияний, это приведет к остановке всех других слияний, включая слияния небольших частей данных. В результате запросы INSERT завершатся ошибкой с сообщением «Merges are processing significantly slower than inserts.» Используйте `SELECT * FROM system.merges` запрос на мониторинг ситуации. Вы также можете проверить следующее: `DiskSpaceReservedForMerge` метрика в системе `system.metrics` таблица, или в графите. Вам не нужно ничего делать, чтобы исправить это, так как проблема будет решена сама собой, как только большие слияния закончатся. Если вы сочтете это неприемлемым, вы можете восстановить предыдущее значение для `max_bytes_to_merge_at_max_space_in_pool` установка. Чтобы сделать это, перейдите в раздел <merge_tree> раздел в конфигурации.xml, набор ``` <merge_tree>``<max_bytes_to_merge_at_max_space_in_pool>107374182400</max_bytes_to_merge_at_max_space_in_pool> ``` и перезагрузите сервер.
|
||||
|
||||
### ClickHouse релиз 1.1.54284, 2017-08-29 {#clickhouse-release-1-1-54284-2017-08-29}
|
||||
|
||||
- Это исправленный выпуск для предыдущей версии 1.1.54282. Он исправляет утечки в каталоге запчастей в ZooKeeper.
|
||||
|
||||
### ClickHouse релиз 1.1.54282, 2017-08-23 {#clickhouse-release-1-1-54282-2017-08-23}
|
||||
|
||||
Этот выпуск содержит исправления ошибок для предыдущей версии 1.1.54276:
|
||||
|
||||
- Исправлено `DB::Exception: Assertion violation: !_path.empty()` при вставке в распределенную таблицу.
|
||||
- Исправлен синтаксический анализ при вставке в формат RowBinary, если входные данные начинаются с';'.
|
||||
- Errors during runtime compilation of certain aggregate functions (e.g. `groupArray()`).
|
||||
|
||||
### Clickhouse Релиз 1.1.54276, 2017-08-16 {#clickhouse-release-1-1-54276-2017-08-16}
|
||||
|
||||
#### Новые средства: {#new-features-4}
|
||||
|
||||
- Добавлен дополнительный раздел для запроса SELECT. Пример запроса: `WITH 1+1 AS a SELECT a, a*a`
|
||||
- Вставка может быть выполнена синхронно в распределенной таблице: OK возвращается только после того, как все данные сохранены на всех осколках. Это активируется установкой insert\_distributed\_sync=1.
|
||||
- Добавлен тип данных UUID для работы с 16-байтовыми идентификаторами.
|
||||
- Добавлены псевдонимы CHAR, FLOAT и других типов для совместимости с таблицей.
|
||||
- Добавлены функции toYYYYMM, toYYYYMMDD и toYYYYMMDDhhmmss для преобразования времени в числа.
|
||||
- Вы можете использовать IP-адреса (вместе с именем хоста) для идентификации серверов для кластеризованных запросов DDL.
|
||||
- Добавлена поддержка непостоянных аргументов и отрицательных смещений в функции `substring(str, pos, len).`
|
||||
- Добавлен параметр max\_size для `groupArray(max_size)(column)` агрегатная функция и оптимизированная ее производительность.
|
||||
|
||||
#### Основное изменение: {#main-changes}
|
||||
|
||||
- Улучшения безопасности: все файлы сервера создаются с разрешениями 0640 (могут быть изменены с помощью <umask> параметр config).
|
||||
- Улучшены сообщения об ошибках для запросов с неверным синтаксисом.
|
||||
- Значительно сокращается потребление памяти и повышается производительность при слиянии больших разделов данных MergeTree.
|
||||
- Значительно повысилась производительность слияний данных для заменяющего движка Mergetree.
|
||||
- Улучшена производительность асинхронных вставок из распределенной таблицы за счет объединения нескольких исходных вставок. Чтобы включить эту функцию, используйте параметр distributed\_directory\_monitor\_batch\_inserts=1.
|
||||
|
||||
#### Назад несовместимые изменения: {#backward-incompatible-changes-1}
|
||||
|
||||
- Изменен двоичный формат агрегатных состояний `groupArray(array_column)` функции для массивов.
|
||||
|
||||
#### Полный список изменений: {#complete-list-of-changes}
|
||||
|
||||
- Добавил тот `output_format_json_quote_denormals` настройка, которая позволяет выводить значения nan и inf в формате JSON.
|
||||
- Оптимизировано распределение потока при чтении из распределенной таблицы.
|
||||
- Настройки можно настроить в режиме только для чтения, если значение не изменяется.
|
||||
- Добавлена возможность извлечения нецелочисленных гранул движка MergeTree для выполнения ограничений на размер блока, указанных в параметре preferred\_block\_size\_bytes. Цель состоит в том, чтобы уменьшить потребление оперативной памяти и увеличить локальность кэша при обработке запросов из таблиц с большими столбцами.
|
||||
- Эффективное использование индексов, содержащих такие выражения, как `toStartOfHour(x)` для таких условий, как `toStartOfHour(x) op сonstexpr.`
|
||||
- Добавлены новые настройки для движков MergeTree (раздел merge\_tree в config.XML):
|
||||
- replicated\_deduplication\_window\_seconds задает количество секунд, разрешенных для дедуплицирующих вставок в реплицируемые таблицы.
|
||||
- cleanup\_delay\_period устанавливает, как часто нужно запустить программу очистки, чтобы удалить устаревшие данные.
|
||||
- replicated\_can\_become\_leader может препятствовать тому, чтобы реплика становилась лидером (и назначала слияния).
|
||||
- Ускоренная очистка для удаления устаревших данных из ZooKeeper.
|
||||
- Множество улучшений и исправлений для кластеризованных DDL-запросов. Особый интерес представляет новая настройка distributed\_ddl\_task\_timeout, которая ограничивает время ожидания ответа от серверов в кластере. Если запрос ddl не был выполнен на всех хостах, ответ будет содержать ошибку таймаута, и запрос будет выполнен в асинхронном режиме.
|
||||
- Улучшено отображение трассировок стека в журналах сервера.
|
||||
- Добавил тот «none» значение для метода сжатия.
|
||||
- Вы можете использовать несколько разделов dictionaries\_config в config.XML.
|
||||
- Можно подключиться к MySQL через сокет в файловой системе.
|
||||
- Система.в таблице деталей появился новый столбец с информацией о размере меток, в байтах.
|
||||
|
||||
#### Устранение ошибок: {#bug-fixes-4}
|
||||
|
||||
- Распределенные таблицы, использующие таблицу слияния, теперь корректно работают для запроса SELECT с условием на `_table` поле.
|
||||
- Исправлено редкое состояние гонки в ReplicatedMergeTree при проверке частей данных.
|
||||
- Исправлена возможная заморозка на «leader election» при запуске сервера.
|
||||
- Параметр max\_replica\_delay\_for\_distributed\_queries был проигнорирован при использовании локальной реплики источника данных. Это было исправлено.
|
||||
- Исправлено некорректное поведение `ALTER TABLE CLEAR COLUMN IN PARTITION` при попытке очистить несуществующий столбец.
|
||||
- Исправлено исключение в функции multif при использовании пустых массивов или строк.
|
||||
- Исправлено чрезмерное выделение памяти при десериализации собственного формата.
|
||||
- Исправлено некорректное автоматическое обновление словарей Trie.
|
||||
- Исправлено исключение при выполнении запросов с предложением GROUP BY из таблицы слияния при использовании SAMPLE.
|
||||
- Исправлена ошибка, из группы при использовании distributed\_aggregation\_memory\_efficient=1.
|
||||
- Теперь вы можете указать базу данных.таблицы в правой стороне и присоединиться.
|
||||
- Слишком много потоков было использовано для параллельной агрегации. Это было исправлено.
|
||||
- Исправлено как то «if» функция работает с аргументами FixedString.
|
||||
- Выберите из распределенной таблицы неправильно сработавшие осколки с весом 0. Это было исправлено.
|
||||
- Бегущий `CREATE VIEW IF EXISTS no longer causes crashes.`
|
||||
- Исправлено некорректное поведение при установке input\_format\_skip\_unknown\_fields=1 и наличии отрицательных чисел.
|
||||
- Исправлен бесконечный цикл в `dictGetHierarchy()` функция, если в словаре есть какие-то недопустимые данные.
|
||||
- Исправлено `Syntax error: unexpected (...)` ошибки при выполнении распределенных запросов с вложенными запросами в предложении IN или JOIN и таблицах слияния.
|
||||
- Исправлена неправильная интерпретация запроса SELECT из таблиц справочника.
|
||||
- Исправлена ошибка «Cannot mremap» ошибка при использовании массивов в предложениях IN и JOIN с более чем 2 миллиардами элементов.
|
||||
- Исправлена ошибка отработки отказа для словарей с MySQL в качестве источника.
|
||||
|
||||
#### Улучшен рабочий процесс разработки и сборки ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse-1}
|
||||
|
||||
- Сборки могут быть собраны в Аркадии.
|
||||
- Вы можете использовать gcc 7 для компиляции ClickHouse.
|
||||
- Параллельные сборки с использованием ccache+distcc теперь работают быстрее.
|
||||
|
||||
### ClickHouse релиз 1.1.54245, 2017-07-04 {#clickhouse-release-1-1-54245-2017-07-04}
|
||||
|
||||
#### Новые средства: {#new-features-5}
|
||||
|
||||
- Распределенный DDL (например, `CREATE TABLE ON CLUSTER`)
|
||||
- Реплицированный запрос `ALTER TABLE CLEAR COLUMN IN PARTITION.`
|
||||
- Движок для таблиц словаря (доступ к данным словаря в виде таблицы).
|
||||
- Компонент Dictionary database engine (этот тип базы данных автоматически содержит таблицы словарей, доступные для всех подключенных внешних словарей).
|
||||
- Вы можете проверить наличие обновлений в словаре, отправив запрос источнику.
|
||||
- Полные имена столбцов
|
||||
- Цитирование идентификаторов с использованием двойных кавычек.
|
||||
- Сеансы в интерфейсе HTTP.
|
||||
- Запрос оптимизации для реплицированной таблицы может выполняться не только на лидере.
|
||||
|
||||
#### Назад несовместимые изменения: {#backward-incompatible-changes-2}
|
||||
|
||||
- Удалить набор глобальных.
|
||||
|
||||
#### Несущественные изменения: {#minor-changes}
|
||||
|
||||
- Теперь после срабатывания предупреждения журнал печатает полную трассировку стека.
|
||||
- Ослаблена проверка количества поврежденных / лишних частей данных при запуске (было слишком много ложных срабатываний).
|
||||
|
||||
#### Устранение ошибок: {#bug-fixes-5}
|
||||
|
||||
- Исправлена плохая связь «sticking» при вставке в распределенную таблицу.
|
||||
- GLOBAL IN теперь работает для запроса из таблицы слияния, которая смотрит на распределенную таблицу.
|
||||
- Неверное количество ядер было обнаружено на виртуальной машине Google Compute Engine. Это было исправлено.
|
||||
- Изменения в том, как работает исполняемый источник кэшированных внешних словарей.
|
||||
- Исправлено сравнение строк, содержащих нулевые символы.
|
||||
- Исправлено сравнение полей первичного ключа Float32 с константами.
|
||||
- Ранее неверная оценка размера поля могла привести к чрезмерно большим распределениям.
|
||||
- Исправлена ошибка, при отправке запроса столбец допускает значения NULL в таблицу с помощью инструкции Alter.
|
||||
- Исправлена ошибка при сортировке по нулевому столбцу, если количество строк меньше предельного.
|
||||
- Исправлен порядок по подзапросу, состоящему только из постоянных значений.
|
||||
- Ранее реплицированная таблица могла оставаться в недопустимом состоянии после неудачного удаления таблицы.
|
||||
- Псевдонимы для скалярных подзапросов с пустыми результатами больше не теряются.
|
||||
- Теперь запрос, который использовал компиляцию, не завершается ошибкой, если файл .so поврежден.
|
1
docs/ru/whats_new/changelog/2017.md
Symbolic link
1
docs/ru/whats_new/changelog/2017.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../../en/whats_new/changelog/2017.md
|
File diff suppressed because it is too large
Load Diff
1
docs/ru/whats_new/changelog/2018.md
Symbolic link
1
docs/ru/whats_new/changelog/2018.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../../en/whats_new/changelog/2018.md
|
File diff suppressed because it is too large
Load Diff
1
docs/ru/whats_new/changelog/2019.md
Symbolic link
1
docs/ru/whats_new/changelog/2019.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../../en/whats_new/changelog/2019.md
|
@ -240,7 +240,7 @@ toc_title: '2020'
|
||||
* Updated checking for hung queries in clickhouse-test script [#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz))
|
||||
* Removed some useless files from repository. [#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
* Changed type of math perftests from `once` to `loop`. [#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||
* Add docker image which allows to build interactive code browser HTML report for our codebase. [#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) See [Woboq Code Browser](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
* Add docker image which allows to build interactive code browser HTML report for our codebase. [#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) See [Woboq Code Browser](https://clickhouse.tech/codebrowser/html_report///ClickHouse/dbms/src/index.html)
|
||||
* Suppress some test failures under MSan. [#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm))
|
||||
* Speedup "exception while insert" test. This test often time out in debug-with-coverage build. [#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
* Updated `libcxx` and `libcxxabi` to master. In preparation to [#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||
|
@ -1,17 +0,0 @@
|
||||
---
|
||||
machine_translated: true
|
||||
machine_translated_rev: 1cd5f0028d917696daf71ac1c9ee849c99c1d5c8
|
||||
---
|
||||
|
||||
# Дорожная карта {#roadmap}
|
||||
|
||||
## Q1 2020 {#q1-2020}
|
||||
|
||||
- Управление доступом на основе ролей
|
||||
|
||||
## Q2 2020 {#q2-2020}
|
||||
|
||||
- Интеграция с внешними службами аутентификации
|
||||
- Пулы ресурсов для более точного распределения емкости кластера между пользователями
|
||||
|
||||
{## [Оригинальная статья](https://clickhouse.tech/docs/en/roadmap/) ##}
|
1
docs/ru/whats_new/roadmap.md
Symbolic link
1
docs/ru/whats_new/roadmap.md
Symbolic link
@ -0,0 +1 @@
|
||||
../../en/whats_new/roadmap.md
|
@ -1,3 +1,5 @@
|
||||
# Security Changelog
|
||||
|
||||
## Исправлено в релизе 19.14.3.3, 2019-09-10 {#ispravleno-v-relize-19-14-3-3-2019-09-10}
|
||||
|
||||
### CVE-2019-15024 {#cve-2019-15024}
|
||||
|
@ -301,13 +301,14 @@ def write_redirect_html(out_path, to_url):
|
||||
except OSError:
|
||||
pass
|
||||
with open(out_path, 'w') as f:
|
||||
f.write(f'''<!DOCTYPE HTML>
|
||||
f.write(f'''<!-- Redirect: {to_url} -->
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en-US">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="refresh" content="0; url={to_url}">
|
||||
<script type="text/javascript">
|
||||
window.location.href = "{to_url}"
|
||||
window.location.href = "{to_url}";
|
||||
</script>
|
||||
<title>Page Redirection</title>
|
||||
</head>
|
||||
@ -318,9 +319,9 @@ def write_redirect_html(out_path, to_url):
|
||||
|
||||
|
||||
def build_redirect_html(args, from_path, to_path):
|
||||
for lang in ['en', 'es', 'fr', 'ja', 'fa']: # TODO: args.lang.split(','):
|
||||
for lang in args.lang.split(','):
|
||||
out_path = os.path.join(args.docs_output_dir, lang, from_path.replace('.md', '/index.html'))
|
||||
version_prefix = args.version_prefix + '/' if args.version_prefix else '/'
|
||||
version_prefix = f'/{args.version_prefix}/' if args.version_prefix else '/'
|
||||
target_path = to_path.replace('.md', '/')
|
||||
to_url = f'/docs{version_prefix}{lang}/{target_path}'
|
||||
to_url = to_url.strip()
|
||||
|
@ -35,6 +35,8 @@ def build_nav_entry(root):
|
||||
title = meta.get('toc_folder_title', 'hidden')
|
||||
prio = meta.get('toc_priority', 9999)
|
||||
logging.debug(f'Nav entry: {prio}, {title}, {path}')
|
||||
if not content.strip():
|
||||
title = 'hidden'
|
||||
result_items.append((prio, title, path))
|
||||
result_items = sorted(result_items, key=lambda x: (x[0], x[1]))
|
||||
result = collections.OrderedDict([(item[1], item[2]) for item in result_items])
|
||||
@ -45,8 +47,16 @@ def build_nav(lang, args):
|
||||
docs_dir = os.path.join(args.docs_dir, lang)
|
||||
_, _, nav = build_nav_entry(docs_dir)
|
||||
result = []
|
||||
index_key = None
|
||||
for key, value in nav.items():
|
||||
if key and value:
|
||||
if value == 'index.md':
|
||||
index_key = key
|
||||
continue
|
||||
result.append({key: value})
|
||||
if index_key:
|
||||
key = list(result[0].keys())[0]
|
||||
result[0][key][index_key] = 'index.md'
|
||||
result[0][key].move_to_end(index_key, last=False)
|
||||
print('result', result)
|
||||
return result
|
||||
|
@ -10,7 +10,7 @@ cssmin==0.2.0
|
||||
future==0.18.2
|
||||
htmlmin==0.1.12
|
||||
idna==2.9
|
||||
Jinja2==2.11.1
|
||||
Jinja2==2.11.2
|
||||
jinja2-highlight==0.6.1
|
||||
jsmin==2.2.2
|
||||
livereload==2.6.1
|
||||
@ -20,7 +20,7 @@ MarkupSafe==1.1.1
|
||||
mkdocs==1.1
|
||||
mkdocs-htmlproofer-plugin==0.0.3
|
||||
mkdocs-macros-plugin==0.4.6
|
||||
nltk==3.4.5
|
||||
nltk==3.5
|
||||
nose==1.3.7
|
||||
protobuf==3.11.3
|
||||
numpy==1.18.2
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user